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

时间:2018-03-05 17:11:20

标签: c++ string search find

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

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

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

或许有一些容器类似于允许快速查找的数组?

我只能在Phyton中找到一种方法,但是我从未在Phyton中编程,所以我想在C ++中使用它。

在Phyton,我发现了这样的事情:

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

3 个答案:

答案 0 :(得分:1)

除非有一个关于某个元素的位置的规则暗示另一个元素的位置(如果存在),否则检测存在的算法必须为O(N)。< / p>

例如,如果向量已排序,那么就会有一个好的定位规则,并且有很多O(log(N))算法:std::lower_bound就是这样的算法功能

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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

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