Как получить первый элемент в std :: set указателей, где указатель указывает на заданное значение c? - PullRequest
0 голосов
/ 03 августа 2020

Скажем, у вас есть C ++ std::set уникальных указателей, например

auto my_set = std::set<std::unique_ptr<std::string>> 
{ 
    std::make_unique<std::string>("monkey"),
    std::make_unique<std::string>("banana"),
    std::make_unique<std::string>("orange") 
};

Используя функцию std::find_if, как бы вы go находили первый элемент в этом наборе, чтобы указатель указывал to "orange"?

Пока что у меня есть:

auto food = "orange";
auto find_orange
   = std::find_if(my_set.begin(), my_set.end(), [&food](const auto& ptr) -> bool {
        return *(*ptr) == food;
    }
);

, но это не компилируется. Есть идеи относительно того, в чем проблема?

Также в таких функциях, что именно ptr, т.е. параметр в предикате? Это указатель на каждый элемент контейнера?

1 Ответ

2 голосов
/ 03 августа 2020

В вопросе отсутствует надлежащий минимально воспроизводимый пример. Когда мы делаем один MCV C: https://godbolt.org/z/bfYx39

Проблема исходит из лямбда-возврата

return *(*ptr) == food;

, поскольку auto есть std::unique_ptr<std::string> . Поэтому вам нужно просто разыменовать один раз:

auto find_orange = std::find_if(my_set.begin(), my_set.end(),
      [&food](const auto& ptr) {
         return *ptr == food;
         //     ^^^^^^^^^^^^
      }
   );

, вам не нужно здесь двойное разыменование.

...