任何内置函数来测试4是否在[1,2,3,4](向量)中

pie*_*fou 4 c++ search stl vector

在Ruby中我可以做到:

 [1,2,3,4].include?(4) #=>True
Run Code Online (Sandbox Code Playgroud)

在Haskell我能做到:

4 `elem`   [1,2,3,4]   #=> True
Run Code Online (Sandbox Code Playgroud)

我该怎么做C++?

Bur*_*ard 20

这里使用find的例子:

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
        std::vector<int> Num(4);
        //insert values
        Num[0]=1;
        Num[1]=2;
        Num[2]=3;
        Num[3]=4;
        std::vector<int>::iterator p = find(Num.begin(), Num.end(), 4);
        if (p == Num.end())
           std::cout  << "Could not find 4 in the vector"  << std::endl;
        else
           std::cout  << "Have found 4 in the vector"  << std::endl;
        return 0;
}
Run Code Online (Sandbox Code Playgroud)

  • std ::发现准确:) (2认同)
  • Burkhart:你在`vector <int> :: iterator`前面忘了一个`std ::`.由于参数依赖查找(或Koenig查找),这里确实没有必要限定`find`.但是,这是一个实现细节.我们知道,`vector <int> :: iterator`*可以*解析为`int*`或者在`std`命名空间中找不到的类型,查找会失败.所以,是的,要完全符合标准,您需要打开(或限定)命名空间. (2认同)
  • 我还必须在不使用命名空间std的情况下限定cout和endl,我不会吗? (2认同)

jal*_*alf 8

没有内置函数正是这样做的.有std::find接近,但由于它不返回bool它使用它有点尴尬.

您可以随时滚动自己,获得类似于JIa3ep建议的语法,但不使用count(总是遍历整个序列):

template <typename iter_t>
bool contains(iter_t first, iter_t last, typename iter_t::value_type val){
    return find(first, last, val) != last;
}
Run Code Online (Sandbox Code Playgroud)

然后你可以简单地这样做来使用它:

std::vector<int> x;

if (contains(x.begin(), x.end(), 4)) {...}
Run Code Online (Sandbox Code Playgroud)

  • C++ 0x有std :: any_of返回一个bool并且会很好地执行此操作.这是在visual studio 2010中的<algorithm>中. (3认同)