2011-06-28 44 views
1

我發現從根據第一個字母陣列中的所有字符串上:find_if一個字符串數組

#include<iostream> 
#include<algorithm> 
#include<string> 

int main(){ 

const std::string strArray[] = {"an","blau","Bo","Boot","bos","da","Fee","fern","Fest","fort","je","jemand","mir","Mix", 
         "Mixer","Name","neu","od","Ort","so","Tor","Torf","Wasser"}; 

std::string value = "JNQ"; 
for_each(value.begin(), value.end(), [strArray](char c){ 
        std::string const * iterator = find_if(strArray, strArray+23, [c](std::string str){ 
                return toupper(str[0]) == c; 
               }); 
        std::cout<<*iterator<<'\n'; 
      }); 

return 0; 
} 

我得到這樣的輸出:

je 
Name 
an 

爲什麼「的」顯示? 我在Ubuntu上使用g ++ 4.5。

回答

2

iterator在第三種情況下無效。

在這種情況下,iterator = strArray + 23指向元素放在數組之後。

看看fixed code

+0

然後找到正確的方法是什麼? – badmaash

+1

@Abhi:'if(iterator!= strArray + 23){std :: cout << * itrerator; }其他{std :: cout <<「錯誤」; }' - > http://ideone.com/Vh16L –

+0

嗯。似乎工作。如果find_if只是返回null,會不會更好? – badmaash

3

與您的代碼的問題是,你不檢查iterator對數組的end,該行之前:

std::cout<<*iterator<<'\n'; 

這實際上應該是這樣的:

if (iterator != (strArray+23)) //print only if iterator != end 
    std::cout<<*iterator<<'\n'; 

見本。它的工作現在。

它不打印"an"了。 :-)

1

其他人已經告訴你迭代器是無效的,所以我不會重複。但是,這裏有一個快速解決方案,可以幫助您。作爲附註,不要使用「幻數」來表示陣列大小。這是容易出錯,因爲如果數組的大小而變化(即你的另一元素添加進去以後),那麼很容易忘記更新23至24考慮這種解決方案:

static unsigned const length = sizeof(strArray); 
std::string const* end = strArray+length; 
std::string const * iterator = find_if(strArray, end, [c](std::string str){ 
            return toupper(str[0]) == c; 
           }); 
if(iterator != end) { 
    std::cout<<*iterator<<'\n'; 
} 

注意我不能因爲我沒有C++ 0x編譯器,所以不要編譯它,所以如果沒有別的東西,請考慮這個僞代碼。

+0

'length'實際上是'sizeof(strArray)/ sizeof(strArray [0]);'因爲否則它會計算指針的大小。 –

+0

@MarkB我想過,但由於strArray是一個靜態數組,我認爲'sizeof(strArray)'將返回數組中元素的數量,而不是字節數。另外我認爲這是一個'std :: string'的數組,而不是指針。但是,我有一段時間沒有完成C++,所以我可能會誤解。無論如何,最終理想的解決方案是使用'std :: vector '。 –

+0

會有效嗎? – badmaash

相關問題