【发布时间】: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;
它总是输出“成员”,即使组字符串向量不包含该术语......所以我不确定这里发生了什么。根据我对功能的理解,这应该可以工作。
谢谢!
【问题讨论】:
-
这是一个
std::vector<std::string> groups,我已将其添加到原始问题中。如果我理解正确,它会指向一个无效的位置......它是如何工作的?刚刚超过最后一个索引的项目不会是一些随机数据吗? -
std::find将返回end()如果未找到该项目,这是不可取消的 - 如果未找到该项目,您的程序将调用未定义的行为(并且可能会崩溃)。end()不是容器中的最后一项,它是最后一项。 -
好的,所以 end() 与实际的最后一个索引不同?