说我有这样的矢量:
vector< pair<string, pair<int, int> > > cont;
现在我想在cont
中找到其first
等于"ABC"
的元素。如何使用STL为我们提供的仿函数和算法轻松完成此任务(find_if,is_equal ??)。 (请不要提升,不要使用新的C ++。)
编辑:是否可以不定义Predicate仿函数?
答案 0 :(得分:7)
像
这样的东西typedef std::pair<std::string, std::pair<int, int> > pair_t;
struct Predicate : public std::unary_function<pair_t, bool>
{
public:
Predicate(const std::string& s):value(s) { }
result_type operator () (const argument_type& pair)
{
return pair.first == value;
}
private:
std::string value;
};
std::vector<pair_t>::const_iterator pos = std::find_if(cont.begin(), cont.end(),
Predicate("ABC"));
或lambda,如果是C ++ 11。
auto pos = std::find_if(cont.begin(), cont.end(),
[](const std::pair<std::string, std::pair<int, int>>& pair)
{
return pair.first == "ABC";
});
实际上,没有结构,有一种不太好的方法可以做这样的事情。
typedef std::pair<std::string, std::pair<int, int> > pair_t;
namespace std {
template<>
bool operator ==<> (const pair_t& first, const pair_t& second)
{
return first.first == second.first;
}
}
std::vector<pair_t>::const_iterator pos = std::find_if(cont.begin(), cont.end(),
std::bind2nd(std::equal_to<pair_t>(), std::make_pair("ABC", std::make_pair(1, 2))));
答案 1 :(得分:1)
如果您需要比O(N)
搜索更快,则可以替换vector
使用map
(或添加并行)进行O(log N)
搜索(或O(1)
和unordered_map
),不需要任何仿函数:
vector<pair<string, pair<int,int>>> cont {{"ABC",{1,11}}, {"DFG",{2,22}}};
map <string, pair<int,int>> M(cont.begin(), cont.end());
cout << M["ABC"] << endl;
使用RO library(可耻的插件),这只是:
#include <sto/sto.h>
using namespace sto;
...
auto it = cont / (_0=="ABC");
此处/
重载op,内部调用find_if
; _0
- 引用STO lambda表达式中元组(或对)的第一个元素; _0=="ABC"
- 为find_if