std::find 条件语句未按预期工作
std::find conditional statement not working as expected
所以我试图用条件语句编写一个循环来比较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
语句搜索每个用户结构的组字符串向量以检查它是否包含字符串 "member"。据我从文档中了解到,std::find
将 return 一个指向包含该成员的索引的迭代器,或者如果没有找到容器中的最后一项。所以我从 std::find
函数中取消引用迭代器并检查它是否匹配。
然而它不起作用。当 groups
向量不包含 "member" 条目时,TRUE 分支仍然运行。我尝试自己输出语句:
std::cout << *std::find(usersInItr->groups.begin(),usersInItr->groups.end(),"member") << std::endl;
它总是输出 "member",即使组字符串向量不包含术语...所以我不确定这里发生了什么。根据我对功能的理解,这应该有效。
谢谢!
从 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;
}
顺便问一下,您更常对组向量进行哪些操作?我怀疑测试该用户是某个组的成员。我只是好奇,在你的情况下,字符串集是更好的解决方案。在我看来,测试 set 中元素的存在性比其他容器更容易,而且它的复杂性比 vector 上的 find 操作要好。当然,为了快速搜索,您必须为较慢的插入付出代价。
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";
所以我试图用条件语句编写一个循环来比较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
语句搜索每个用户结构的组字符串向量以检查它是否包含字符串 "member"。据我从文档中了解到,std::find
将 return 一个指向包含该成员的索引的迭代器,或者如果没有找到容器中的最后一项。所以我从 std::find
函数中取消引用迭代器并检查它是否匹配。
然而它不起作用。当 groups
向量不包含 "member" 条目时,TRUE 分支仍然运行。我尝试自己输出语句:
std::cout << *std::find(usersInItr->groups.begin(),usersInItr->groups.end(),"member") << std::endl;
它总是输出 "member",即使组字符串向量不包含术语...所以我不确定这里发生了什么。根据我对功能的理解,这应该有效。
谢谢!
从 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;
}
顺便问一下,您更常对组向量进行哪些操作?我怀疑测试该用户是某个组的成员。我只是好奇,在你的情况下,字符串集是更好的解决方案。在我看来,测试 set 中元素的存在性比其他容器更容易,而且它的复杂性比 vector 上的 find 操作要好。当然,为了快速搜索,您必须为较慢的插入付出代价。
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";