我根据第一个字母找到数组中的所有字符串:
#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
为什么'an'显示? 我在Ubuntu上使用g ++ 4.5。
答案 0 :(得分:3)
您的代码存在的问题是,在此行之前,您没有针对数组的iterator
检查end
:
std::cout<<*iterator<<'\n';
其实应该是这样的:
if (iterator != (strArray+23)) //print only if iterator != end
std::cout<<*iterator<<'\n';
看到这个。它现在正在工作。
它不再打印"an"
。 : - )
答案 1 :(得分:2)
答案 2 :(得分: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编译器,所以如果没有别的话,请考虑这个伪代码。