Как искать в `std :: list` структуры? - PullRequest
3 голосов
/ 12 июня 2019

Проблема в том, что я не могу искать в std::list, в соответствии с пользовательским вводом vID.

Я пробовал много разных подходов, но он не работал.

struct VideoDetails
{
  int VidID, Copies;
  string MovieTitle, Genre, Production, FileName;

};
list <VideoDetails> MyList;
int vID;
cin >> vID;

Первая попытка :

find_if(MyList.begin(), MyList.end(), [](VideoDetails & VD) {return VD.VidID == vID; });

Вторая попытка :

auto pred = [](const VideoDetails & ID) { return ID.VidID == vID;  };
find_if(Mylist.begin(), MyList.end(), vID) != MyList.end();

Третья попытка :

list <VideoDetails>::iterator iter;
for(iter = MyList.begin(); iter != MyList.end(); ++iter)
{
  if ((*iter).VidID == vID) {
    //  
  } else {
    //
  }
}

Ошибка первой попытки :

Error (active) E1738 the enclosing-function 'this' cannot be referenced in a lambda body unless it is in the capture list mp 3      

Ошибка третьей попытки :

Error C2678 binary '==': no operator found which takes a left-hand operand of type 'int' (or there is no acceptable conversion) mp 3

1 Ответ

4 голосов
/ 12 июня 2019

Первый способ : вы не захватили vID внутри лямбды, вот на что жаловалось сообщение об ошибке.

const auto iter = std::find_if(MyList.begin(), MyList.end(), 
                  [vID](const VideoDetails& VD) {return VD.VidID == vID; });
         //        ^^^^

И не забудьте получить итератор, возвращающийся с std::find_if, в случае дальнейшего использования. Если вы исправите вышесказанное, ваш первый метод будет работать.

Второй метод : Не имеет большой разницы, чем тот. У лямбды та же проблема, что и выше. В дополнение к этому std::find_if требуется унарный предикат, а не значение, которое можно найти в контейнере. Изменить на

auto pred = [vID](const VideoDetails & ID) {   return ID.VidID == vID; }
//           ^^^^
if(std::find_if(Mylist.begin(), MyList.end(), pred ) != MyList.end())
//                                            ^^^^
{
   // do something
}

Если вы поработали с std::find_if и лямбдой, вам не нужно идти на третью попытку.

...