我按照https://stackoverflow.com/a/590005/1729501这个回答写了下面的代码。
#include <iostream>
#include <algorithm>
#include <iterator>
#include <vector>
using namespace std;
struct alpha {
int x;
int y;
};
struct find_element
{
int y;
find_element(int y) : y(y) {}
bool operator ==( const alpha& l) const
{
return y == l.y;
}
};
int main() {
std::vector<alpha> vAlpha;
vAlpha[0].x = 10;
vAlpha[0].y = 100;
for(std::vector<alpha>::iterator it = vAlpha.begin(); it != vAlpha.end(); ++it) {
int k = 100;
// trying to find k in the complete vector
if (vAlpha.end() == std::find_if( vAlpha.begin(), vAlpha.end(), find_element(k))) {
cout << " not found! ";
} else {
cout << " found ";
}
}
return 0;
}
这会产生编译错误
In file included from /usr/include/c++/4.7/algorithm:63:0,
from prog.cpp:2: /usr/include/c++/4.7/bits/stl_algo.h: In instantiation of
‘_RandomAccessIterator std::__find_if(_RandomAccessIterator,
_RandomAccessIterator, _Predicate, std::random_access_iterator_tag) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<alpha*,
std::vector<alpha> >; _Predicate = find_element]’:
/usr/include/c++/4.7/bits/stl_algo.h:4490:41: required from ‘_IIter
std::find_if(_IIter, _IIter, _Predicate) [with _IIter =
__gnu_cxx::__normal_iterator<alpha*, std::vector<alpha> >; _Predicate = find_element]’ prog.cpp:30:88: required from here /usr/include/c++/4.7/bits/stl_algo.h:210:4: error: no match for call
to ‘(find_element) (alpha&)’
如果我在find_element
内移动main()
结构,则会出现以下错误,
prog.cpp: In function ‘int main()’: prog.cpp:31:88: error: no matching
function for call to ‘find_if(std::vector<alpha>::iterator,
std::vector<alpha>::iterator, main()::find_element)’ prog.cpp:31:88:
note: candidate is: In file included from
/usr/include/c++/4.7/algorithm:63:0,
from prog.cpp:2:
有人可以告诉我正确的语法吗?
答案 0 :(得分:5)
正如其他人已经说过的那样,您需要实施operator()
而不是operator==
。
struct find_element
{
int y;
find_element(int y) : y(y) {}
bool operator()(const alpha& l) const
{
return y == l.y;
}
};
您的用法是正确的:
std::find_if(vAlpha.begin(), vAlpha.end(),
find_element(k))
如果你正在使用C ++ 11,你可以选择使用lambda:
std::find_if(vAlpha.begin(), vAlpha.end(),
[=](const alpha& l){ return k == l.y; })
然后你可以完全省略你的find_element
结构 - 单行lambda完成所有事情。非常简洁!
答案 1 :(得分:3)
您应该为算法提供函数调用操作符()
,而不是等于运算符==
。
struct find_element
{
int y;
find_element(int y) : y(y) {}
bool operator () ( const alpha& l) const
{
return y == l.y;
}
};
它在C ++中称为functor。有关详细信息,请参阅this answer。
答案 2 :(得分:1)
您的仿函数应该重载operator()
而不是operator==
struct find_element
{
int y;
find_element(const int& y) : y(y) {}
bool operator ()( const alpha& l) const
// ^^^^
{
return y == l.y;
}
};
如果您要重载==
,请对alpha
结构执行此操作,并使用默认情况下使用std::find
的{{1}}
其他问题。
这是错误的
operator==
0还没有元素。您正在分配给不存在的成员。这是未定义的行为。它应该是这样的
std::vector<alpha> vAlpha;
vAlpha[0].x = 10;
vAlpha[0].y = 100;
OR
std::vector<alpha> vAlpha(1);
// ^^^ now it has 1 element
vAlpha[0].x = 10;
vAlpha[0].y = 100;
答案 3 :(得分:1)
std::find_if
需要UnaryPredicate,尝试重载operator()
:
struct find_element
{
int y;
find_element(int y) : y(y)
{
}
bool operator()(const alpha& l)
{
return y == l.y;
}
};