find_if в строковом массиве - PullRequest
1 голос
/ 28 июня 2011

Я нахожу все строки из массива в зависимости от первой буквы:

#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»? Я использую g ++ 4.5 на Ubuntu.

Ответы [ 3 ]

3 голосов
/ 28 июня 2011

Проблема с вашим кодом в том, что вы НЕ проверяете iterator против end массива перед этой строкой:

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

что на самом деле должно быть:

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

Посмотри на это. Это работает сейчас.

Он больше не печатает "an". : -)

2 голосов
/ 28 июня 2011

iterator недопустимо в третьем случае.

В этом случае iterator = strArray + 23 и указывают на элемент, расположенный после массива.

Посмотрите фиксированный код .

1 голос
/ 28 июня 2011

Другие уже говорили вам, что итератор недействителен, поэтому я не буду повторять это. Тем не менее, вот быстрый тип решения, которое должно работать для вас. Как примечание, не используйте «магические числа» для представления размеров вашего массива. Это подвержено ошибкам, потому что если размер массива изменяется (т.е. вы добавляете в него другой элемент позже), то легко забыть обновить 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, поэтому рассмотрите этот псевдокод, если ничего другого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...