найти элемент в списке указателей - PullRequest
8 голосов
/ 21 июля 2011

Я пытаюсь понять, как найти элемент в списке указателей в C ++, используя std :: find

Если бы я имел, например:

std::list<string> words;
std::string word_to_be_found;

Я мог бы просто искать вот так:

std::list<string>::iterator matching_iter = std::find(words,begin(), words.end(), word_to_be_found)

а что если у меня есть список указателей?

std::list<string *> words;

приведенный выше синтаксис больше не будет работать. Могу ли я сделать это похожим способом?

спасибо!

Ответы [ 3 ]

11 голосов
/ 21 июля 2011

Вы можете передать предикат функции std::find_if:

bool pointee_is_equal(const std::string& s, const std::string* p) {
    return s == *p;
}

// ...
std::list<string>::iterator matching_iter =
              std::find_if(words,begin(), words.end(),
                          std::bind1st(pointee_is_equal, word_to_be_found));

В C ++ 11 это становится намного проще, благодаря лямбдам:

auto matching_iter = std::find_if(words,begin(), words.end(),
                     [&word_to_be_found](const std::string* p) {
                         return word_to_be_found == *p;
                     });
3 голосов
/ 21 июля 2011

Укажите свой собственный предикат:

struct comparator
{
  bool operator()(std::string const* item)
  {
    return toFind == *item;
  }
  std::string toFind;
};

comparator cinst = { word_to_find };
std::list<string*>::iterator matching_iter = std::find_if(words,begin(), words.end(), cinst)
2 голосов
/ 21 июля 2011

Вместо этого вы хотите использовать std::find_if() и предоставить ему функтор для сравнения.

...