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

时间:2015-12-13 06:34:46

标签: c++ vector struct std

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

结构存储在一个向量中,封装for循环使用const_iterator usersInItr进行迭代。 struct包含用户名的字符串,以及类型为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语句搜索每个用户结构的组字符串向量,以检查它是否包含字符串“member”。根据我从文档中理解的内容,std::find将返回一个迭代器,该迭代器指向包含该成员的索引,或者如果找不到容器中的最后一项。所以我从std::find函数中取消引用迭代器并检查它是否匹配。

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

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

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

谢谢!

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:0)

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

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/