【问题标题】:In C++ check if std::vector<string> contains a certain value [duplicate]在 C++ 中检查 std::vector<string> 是否包含某个值 [重复]
【发布时间】:2011-09-10 18:46:42
【问题描述】:

是否有任何内置函数告诉我我的向量是否包含某个元素 例如

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?

【问题讨论】:

标签: c++ vector std stdvector


【解决方案1】:
  1. 如果您的容器仅包含唯一值,请考虑改用 std::set。它允许查询具有对数复杂度的集合成员。

     std::set<std::string> s;
     s.insert("abc");
     s.insert("xyz");
     if (s.find("abc") != s.end()) { ...
    
  2. 如果您的向量保持排序,请使用std::binary_search,它也提供对数复杂度。

  3. 如果所有其他方法都失败了,请退回到std::find,这是一个简单的线性搜索。

【讨论】:

  • 更好的是,如果您不需要对字符串进行排序,请使用std::tr1::unordered_set&lt;std::string&gt;,可从&lt;tr1/unordered_set&gt;&lt;unordered_set&gt; 获得,它具有(几乎)恒定的查找和查询时间。使用 set 或 unordered_set,您也可以选择说 if (s.count("abc"))。不要忘记接受其中一个答案。
  • 所有这三个链接似乎都链接到现在存档的页面。
【解决方案2】:

在 C++11 中,您可以改用 std::any_of

查找数组中是否有任何零的示例:

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...";

【讨论】:

  • 我发现 any_of 比 find 好得多,因为 find 返回一个向量迭代器到元素,而 any_of 返回一个布尔值,更适合 if 情况
  • 你能补充一些细节吗?使用示例和文档链接。
  • @JamieBullock 你看过这个answer吗?
  • @Xam 谢谢。我知道如何使用any_of,我鼓励colddie改进答案
【解决方案3】:

你可以使用std::find如下:

if (std::find(v.begin(), v.end(), "abc") != v.end())
{
  // Element in vector.
}

为了能够使用std::findinclude &lt;algorithm&gt;

【讨论】:

  • 如果我要搜索的东西是 argv,它不是向量或数组(我试图查看某个命令行参数选项是否存在于通过argv)?我创建了一个包含argv 的所有“元素”的向量并应用了您的解决方案,但我不确定它有多干净。
  • @jphollowed std::string const searchStr = "magic"; auto result = std::find_if(argv + 1, argv + argc, [&amp;](char const * const arg) { return arg == searchStr; }); 有效。虽然没有那么干净和简洁。你至少需要 C++11 才能编译。
【解决方案4】:

【讨论】:

    【解决方案5】:

    它在&lt;algorithm&gt; 中并称为std::find

    【讨论】:

      猜你喜欢
      • 2011-03-27
      • 2016-10-16
      • 2022-01-05
      • 1970-01-01
      • 2014-05-26
      • 2019-12-29
      • 2016-06-27
      • 2014-10-14
      • 1970-01-01
      相关资源
      最近更新 更多