如何在结构的`std::list`中搜索?

Posted

技术标签:

【中文标题】如何在结构的`std::list`中搜索?【英文标题】:How to search in `std::list` of struct? 【发布时间】:2019-06-12 15:07:29 【问题描述】:

问题是我无法在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】:

第一种方法:您没有在 lambda 中捕获 vID,这就是错误消息所抱怨的原因。

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

并且不要忘记让迭代器从std::find_if 返回,以防进一步使用。如果您更正上述情况,您的第一种方法将起作用。

第二种方法:与第一种没有太大区别。 lambda 有与上述相同的问题。除此之外,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 和 lambda,则无需进行第三次尝试。

【讨论】:

E1738 封闭函数 'this' 不能在 lambda 主体中引用,除非它在捕获列表中 E1730 成员“MyClass::vID”不是变量 第二个错误在我把“vID”放入lambda时存在 @lRinzu 我假设有一个类包含上述代码。这些是您上面未显示的代码中的错误消息。请使用minimal complete example which produces the above-mentioned errors 更新或创建新问题。那么只有别人才能更好地帮助你。

以上是关于如何在结构的`std::list`中搜索?的主要内容,如果未能解决你的问题,请参考以下文章

C++ STL应用与实现6: 如何使用std::list

C++ STL应用与实现6: 如何使用std::list

C++ STL应用与实现6: 如何使用std::list

如何访问使用 <list> 库创建的列表中的结构元素?

我可以在 std::list 中移动元素而不会使迭代器或引用无效,但是如何?

如何获得std :: list ::来自该列表元素的iterator?