std::find 条件语句未按预期工作

Posted

技术标签:

【中文标题】std::find 条件语句未按预期工作【英文标题】:std::find conditional statement not working as expected 【发布时间】:2015-12-13 06:34:46 【问题描述】:

所以我尝试用条件语句编写一个循环,比较struct 的成员,如果成员值与要求匹配,则输出一些数据。

结构存储在一个向量中,封装的 for 循环使用 const_iterator usersInItr 迭代该向量。该结构包含用户名字符串和std::vector<std::string> groups 类型组的字符串向量。

这是代码的具体部分比较麻烦:

//Look for member group to proceed with output
if(*std::find(usersInItr->groups.begin(),usersInItr->groups.end(),"member")=="member")
    
    ConfigFile << usersInItr->username << std::endl;

else

    std::cout << "Nope" << std::endl;

想法是std::find 语句搜索每个用户结构的组字符串向量以检查它是否包含字符串“成员”。根据我从文档中了解到的情况,std::find 将返回一个迭代器,该迭代器指向包含该成员的索引,或者如果未找到容器中的最后一项。所以我从std::find 函数中取消引用迭代器并检查它是否匹配。

但是它不起作用。当groups 向量不包含“成员”条目时,TRUE 分支仍然运行。我尝试自己输出语句:

std::cout << *std::find(usersInItr->groups.begin(),usersInItr->groups.end(),"member") << std::endl;

它总是输出“成员”,即使组字符串向量不包含该术语......所以我不确定这里发生了什么。根据我对功能的理解,这应该可以工作。

谢谢!

【问题讨论】:

请发帖MCVE。 usersInItr-&gt;groups 的类型是什么?顺便说一句,std::find 将返回刚刚过去的最后一项的“item”,而不是最后一项,所以不要在不检查的情况下取消引用返回的迭代器! 这是一个std::vector&lt;std::string&gt; groups,我已将其添加到原始问题中。如果我理解正确,它会指向一个无效的位置......它是如何工作的?刚刚超过最后一个索引的项目不会是一些随机数据吗? std::find 将返回 end() 如果未找到该项目,这是不可取消的 - 如果未找到该项目,您的程序将调用未定义的行为(并且可能会崩溃)。 end() 不是容器中的最后一项,它是最后一项。 好的,所以 end() 与实际的最后一个索引不同? 【参考方案1】:

std::find 返回的迭代器将指向“item”刚刚过去的最后一项,而不是最后一项,所以不要在不检查的情况下取消引用它。

要查看是否找到了某个项目,您应该这样写:

if(std::find(usersInItr->groups.begin(),usersInItr->groups.end(),"member") != usersInItr->groups.end())
    
    ConfigFile << usersInItr->username << std::endl;

else

    std::cout << "Nope" << std::endl;

【讨论】:

【参考方案2】:

顺便问一下,您更经常对组向量进行哪些操作?我怀疑测试该用户是某个组的成员。我只是好奇,在你的情况下,字符串集是更好的解决方案。在我看来,测试集合中元素的存在比其他容器更舒服,并且它的复杂性比向量上的查找操作要好。当然,为了快速搜索,您必须支付速度较慢的插入费用。

std::set<std::string> s;
s.insert( "some group" );
s.insert( "member" );
s.insert( "another group" );

if( s.count( "member" ) > 0 )
  std::cout << "Yes";
else
  std::cout << "No";

更多详情请参考http://www.cplusplus.com/reference/set/set/

【讨论】:

以上是关于std::find 条件语句未按预期工作的主要内容,如果未能解决你的问题,请参考以下文章

QML 条件绑定未按预期工作

猫鼬发现或条件未按预期工作

为啥我的硒预期条件不能作为 python if 语句中的条件工作?

相同“if”条件下的两个“==”等式运算符未按预期工作

解决了| Python:If/elif/else 语句未按预期工作?

Sql 语句:在要插入的字段中未指定主键时,插入键更新未按预期工作