我可以在没有循环的情况下检查数组/向量内的单词吗?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我可以在没有循环的情况下检查数组/向量内的单词吗?相关的知识,希望对你有一定的参考价值。

我相信我可以说......

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

问题是,我需要用很多单词多次这样做。有时我想一次做很多话。像if (words[0] == noun[/*any*/] && 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 exist in a array

答案

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

例如,如果向量被排序,则保持良好的定位规则,并且存在大量的O(log(N))算法:std::lower_bound就是这样一个函数。

另一答案

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

另一答案

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

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

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

以上是关于我可以在没有循环的情况下检查数组/向量内的单词吗?的主要内容,如果未能解决你的问题,请参考以下文章

我可以检查字符串中是否包含数组的元素吗?

如何在不重复单词并遍历整个数组的情况下从数组中随机播放文本? (迅速)

在没有向量、指针的情况下在 C++ 中在运行时增加数组大小 [关闭]

Python检查一个值是不是大于数组/向量中的下一个值[重复]

MATLAB中向量数组的向量范数

在没有排序函数的数组中对字符串进行排序 - Ruby