find_if在字符串数组上

时间:2011-06-28 13:09:49

标签: string foreach c++

我根据第一个字母找到数组中的所有字符串:

#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。

3 个答案:

答案 0 :(得分:3)

您的代码存在的问题是,在此行之前,您没有针对数组的iterator检查end

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

其实应该是这样的:

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

看到这个。它现在正在工作。

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

答案 1 :(得分:2)

iterator在第3种情况下无效。

在这种情况下iterator = strArray + 23并指向放在数组之后的元素。

查看fixed code

答案 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编译器,所以如果没有别的话,请考虑这个伪代码。