2016-02-18 86 views
2

我想通过指针向量搜索并比较指向int的指针。我最初的想法是使用std::find(),但我意识到我无法比较指向int的指针。std :: find()指针向量

实施例:

if(std::find(myvector.begin(), myvector.end(), 0) != myvector.end() 
{ 
    //do something 
} 

myvector是包含指向一个类对象vector<MyClass*> myvector一个载体,即,。 MyClass包含一个方法getValue()这将返回一个整数值,我基本上想要通过向量,并检查每个对象的getValue()返回值,以确定我做什么。

使用前面的例子:

if(std::find(myvector.begin(), myvector.end(), 0) != myvector.end() 
{ 
    //Output 0 
} 
else if(std::find(myvector.begin(), myvector.end(), 1) != myvector.end() 
{ 
    //Output 1 
} 
else if(std::find(myvector.begin(), myvector.end(), 2) != myvector.end() 
{ 
    //Output 2 
} 

它几乎就像一个绝对的条件,其中如果任何指针在我的矢量的值为0,I输出为零,我输出0。如果没有发现零,我看看看是否有1.如果找到1,I输出1等等,等等。

+0

'getValue()'是一个'const'函数吗? –

+0

@MooingDuck是 – Noobgineer

回答

5

使用std::find_if()代替。其他答案显示了如何为谓词使用lambda,但只适用于C++ 11及更高版本。如果您使用的是较早的C++版本,则可以这样做:

struct isValue 
{ 
    int m_value; 

    isValue(int value) : m_value(value) {} 

    bool operator()(const MyClass *cls) const 
    { 
     return (cls->getValue() == m_value); 
    } 
}; 

... 

if (std::find_if(myvector.begin(), myvector.end(), isValue(0)) != myvector.end() 
{ 
    //... 
} 
+0

感谢您提供此解决方案,因为我使用的是早期版本的C++。你能解释一下'struct isValue'吗?我知道我会在哪里使用它。 – Noobgineer

+0

'isValue'结构被用作'std :: find_if()'谓词:'std :: find_if(...,isValue(0))'。结构的新实例用所需的比较值构造,然后将该实例传递给'std :: find_if()'。谓词接受可以使用'result = predicate(params)'语法调用的任何东西,它包括普通函数,带有重载操作符()',lambdas等的对象。 –

+0

我得到以下错误:'error:passing' const MyClass'作为'char'的参数'char MyClass :: getValue()'放弃限定符[-fpermissive]'我几乎复制了你写的东西。 – Noobgineer

0

您可以使用std::find_if它依赖于一个谓语,而不是一个值

if(std::find_if(myvector.begin(), myvector.end(), [](MyClass* my) { return my->getValue() == 0; }) != myvector.end() 
{ 
    //Output 0 
} 
6

你は什么nt是std::find_if和自定义比较函数/ functor/lambda。使用自定义比较器,您可以调用正确的功能来进行比较。像

std::find_if(myvector.begin(), myvector.end(), [](MyClass* e) { return e->getValue() == 0; }) 
1

东西,你需要告诉您要调用每个指针getValue()编译器,这就是你正在寻找的东西。 std::find()仅用于匹配值,任何东西更复杂,有std::find_if

std::find_if(myvector.begin(), myvector.end(), 
    [](const MyClass* c) { return c->getValue() == 0; } 
);