如何在结构的`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`中搜索?的主要内容,如果未能解决你的问题,请参考以下文章