【问题标题】:Can I check for a word inside of an array/vector without looping through it?我可以在不循环的情况下检查数组/向量中的单词吗?
【发布时间】:2018-08-13 10:18:28
【问题描述】:

我相信我可以说...

for (int i = 0; i < noun[].size(); i++)
 {
    if ( word[0] == noun[i])
    { //do something }
 }

问题是,我需要用很多词多次这样做。有时我想一次说很多话。就像if (words[0] == noun[/*any*/] &amp;&amp; words[1] == verb [/*any*/]) 有什么办法可以告诉它检查数组/向量中的每个元素吗?

或者也许有一些类似于数组的容器可以快速查找?

我只能在 python 中找到一种方法,但我从来没有用 python 编程,所以我想用 C++ 来做。

在python中我发现了这样的东西:

a = [1,2,3,4,5]
b = 4
if b in a:
  print("True!")
else:
  print("False")

从这里:Check if a value exists in an array in Cython

【问题讨论】:

  • 我相信你可以使用一些algorithms 来做到这一点。显然这些在内部会有某种循环,但你不必自己做。
  • noun[].size() noun 应该是什么?
  • @KillzoneKid 所以名词可以是名词列表中的任何名词,例如Alice、Thomas、Mark 等。我的词向量将由构成用户输入的字符串的词组成。
  • 我相信您正在寻找std::find。当然,这将循环通过向量,就像 python 示例所做的那样,只是你不必编写循环代码

标签: c++ string search find


【解决方案1】:

除非存在关于向量中特定元素的 位置 的某些规则暗示另一个元素的位置,如果存在,则检测存在的算法必须是 O(N)。

例如,如果向量是排序的,那么一个好的定位规则就成立了,并且有很多 O(log(N)) 算法:std::lower_bound 就是这样一个函数。

【讨论】:

    【解决方案2】:

    矢量容器未针对查找进行优化。你需要的可能是需要一套。我建议你检查这个question的答案。

    【讨论】:

    • 如果只是数组中的问题,set 可能比映射更可取(key/val 对的值是什么?)
    • 刚刚检查了设置的实现,你是对的。刚刚编辑。
    【解决方案3】:

    考虑到您的示例包括verbnoun,您将尝试在(实际上)固定的字典中查找单词。有许多为此目的而优化的容器。

    标准库包含std::set&lt;&gt;std::set&lt;std::string&gt; nouns 可以使用。它具有 O(log N) 查找。效率稍高一点,还有std::unordered_map&lt;&gt;,它仍然足以满足您的需求——您只需要知道名词列表中是否出现了一个单词,而不需要知道下一个名词是什么。

    在标准库之外,还有更多的数据结构。 trie aka 前缀树共享其条目的前缀,这是节省空间的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-22
      • 1970-01-01
      • 2017-11-11
      相关资源
      最近更新 更多