In C++ check if std::vector<string> contains a certain value
有没有内置函数告诉我向量是否包含某个元素例如
1 2 3 4 5 6
| std::vector<string> v;
v.push_back("abc");
v.push_back("xyz");
if (v.contains("abc")) // I am looking for one such feature, is there any
// such function or i need to loop through whole vector? |
- stackoverflow.com/questions/507884/&hellip;
- 至于C++ 11,这个问题不再是重复的,因为EDCOX1的0现在给出了一个具体的方法,如果容器包含匹配项,则返回true,而不是使用STD::查找返回匹配的元素。感谢@酷迪的原始正确答案。
- 相关:stackoverflow.com/a/31933118/8781554
您可以使用std::find如下:
1 2 3 4
| if (std::find(v.begin(), v.end(),"abc") != v.end())
{
// Element in vector.
} |
能够使用std::find:include 。
- 如果我要搜索的对象是不是向量或数组的argv,该怎么办(我试图查看传递的argv中是否存在某个命令行参数选项)?我创建了一个包含argv的所有"元素"的向量,并应用了您的解决方案,尽管我不确定这有多干净。
- @JP挖空的std::string const searchStr ="magic"; auto result = std::find_if(argv + 1, argv + argc, [&](char const * const arg) { return arg == searchStr; });工程。不过,并没有那么简洁明了。你至少需要C++ 11来编译。
如果容器只包含唯一值,请考虑使用std::set。它允许查询具有对数复杂性的集合成员。
1 2 3 4
| std::set<std::string> s;
s.insert("abc");
s.insert("xyz");
if (s.find("abc") != s.end()) { ... |
如果向量保持排序,那么使用std::binary_search,它也提供对数复杂性。
如果所有其他方法都失败了,则返回到std::find,这是一个简单的线性搜索。
- 更好的是,如果您不需要对字符串进行排序,请使用从或获得的std::tr1::unordered_set,它具有(几乎)恒定的查找和查询时间。无论是集合还是无序集合,你都可以选择说if (s.count("abc"))。别忘了接受其中一个答案。
- 所有这三个链接似乎都链接到现在存档的页面。
在C++ 11中,您可以使用EDCOX1 OR 9来代替。
查找数组中是否有零的示例:
1 2 3
| std::array<int,3> foo = {0,1,-1};
if ( std::any_of(foo.begin(), foo.end(), [](int i){return i==0;}) )
std::cout <<"zero found..."; |
- 我发现任何一个_都比find好得多,因为find向元素返回一个向量迭代器,而任何一个_都返回一个布尔值,并且更适合于if情况。
- 你能再加些细节吗?如何使用的示例和到文档的链接。
- @Jamiebullock你看到这个答案了吗?
- 谢谢。我知道如何使用any_of,我鼓励colddie改进答案。
在里,叫std::find。
std::find()。