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

问题描述 投票:0回答:3

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

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

c++ string search find
3个回答
1
投票

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

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


0
投票

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


0
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.