我尝试使用find_if通过其值在地图中查找关键字。但我无法编译代码:
struct IsCurrency : binary_function<pair<const Bill::CodeCurrency, string>, string, bool> {
bool isCurrency(const pair<const Bill::CodeCurrency, string>& element, const string& expected) const {
return element.second == expected;
}
};
string currency = "RUB";
map<Bill::CodeCurrency, string>::const_iterator my_currency = find_if(Bill::currency_code_map().begin(), Bill::currency_code_map().end(), bind2nd(IsCurrency(), currency)); /// <--- ERROR IS HERE
Bill::CodeCurrency
是一个枚举。
错误:
/usr/include/c++/4.7/bits/stl_algo.h:4490:41: required from ‘_IIter std::find_if(_IIter, _IIter, _Predicate) [with _IIter = std::_Rb_tree_const_iterator<std::pair<const Bill::CodeCurrency, std::basic_string<char> > >; _Predicate = std::binder2nd<IsCurrency>]’
../src/money_acceptor/itl_bill_acceptor.cpp:182:121: required from here
/usr/include/c++/4.7/backward/binders.h:155:29: error: no match for call to ‘(const IsCurrency) (const first_argument_type&, const second_argument_type&)’
请你帮我确定这里的错误是什么?
答案 0 :(得分:0)
将bool isCurrency(...)
替换为bool operator () (...)
,以使您的结构可以调用。
答案 1 :(得分:0)
正如我的评论中所述,实际问题是提供给find_if
的谓词需要operator()
,而不是某个名称类似于类名的函数。
C ++ 03版:
#include <map>
#include <functional>
#include <string>
#include <algorithm>
namespace Bill
{
enum CodeCurrency
{
A, B, C
};
typedef std::map<CodeCurrency, std::string> currency_code_map_t;
currency_code_map_t const& currency_code_map()
{
static currency_code_map_t m;
return m;
}
}
struct IsCurrency
: std::binary_function< Bill::currency_code_map_t::value_type, std::string,
bool >
{
bool operator()(Bill::currency_code_map_t::value_type const& element,
std::string const& expected) const
{
return element.second == expected;
}
};
int main()
{
std::string currency = "RUB";
Bill::currency_code_map_t::const_iterator my_currency =
std::find_if( Bill::currency_code_map().begin(),
Bill::currency_code_map().end(),
bind2nd(IsCurrency(), currency) );
}
C ++ 11版本:
#include <map>
#include <functional>
#include <string>
#include <algorithm>
namespace Bill
{
enum CodeCurrency
{
A, B, C
};
typedef std::map<CodeCurrency, std::string> currency_code_map_t;
currency_code_map_t const& currency_code_map()
{
static currency_code_map_t m;
return m;
}
}
int main()
{
std::string currency = "RUB";
auto check = [¤cy](Bill::currency_code_map_t::value_type const& element)
{ return element.second == currency; };
auto my_currency =
std::find_if( Bill::currency_code_map().cbegin(),
Bill::currency_code_map().cend(),
check );
}
注意此算法为O(N)。如果需要经常查找元素,可能需要考虑使用类似boost::bimap
的东西,可以是O(logN)。