我想在vector<std::pair<int, vector<int> > >
内搜索。由于矢量参数,这将无法工作:
std::vector<std::pair<int, std::vector<int> > > myVec;
iterator = find(myVec.begin(), myVec.end(), i);
搜索将位于第一个std::pair
模板参数(int
)上,以便获取与之关联的向量。
答案 0 :(得分:6)
std::vector<std::pair<int, std::vector<int> > > myVec;
这需要lambda表达式的C ++ 0x:
typedef std::pair<int, std::vector<int>> pair_type
std::find_if(myVec.begin(), myVec.end(), [i](pair_type const& pair)
{ return pair.first == i; });
如果您没有使用C ++ 0x,那么要么推出自己的循环,要么使用像Boost.Phoenix / Boost.Lambda这样的东西。
或,对于这两种情况,为什么不使用std::map
?
答案 1 :(得分:2)
您正在尝试将 int
映射到int
的向量。
请尝试map<int, vector<int> >
。
答案 2 :(得分:2)
你可以使用以下(非常丑陋)的functoid:
struct FindFirst {
FindFirst(int i) : toFind(i) { }
int toFind;
bool operator()
( const std::pair<int, std::vector<int> > &p ) {
return p.first==toFind;
}
};
像这样使用它(我无法使bind2nd工作 - 这就是我使用c'tor的原因):
int valueToFind = 4;
std::find_if(myVec.begin(), myVec.end(), FindFirst(valueToFind));
我认为您想要的是地图:
std::map< int, vector< int > > foo;
然后您可以添加元素,按键等搜索:
int key = 4; //This will be the key
vector<int> value(5, 4); //Fill some values (5 4's in this case) into the vector
foo[key]=value; //Adds the pair to the map. Alternatively;
foo.insert( make_pair(key, value) ); //Does the same thing (in this context)
考虑一下你做事的方式,你可能想要std::multimap
(允许多个值具有相同的密钥)Class docs here
答案 3 :(得分:1)
向量的第二个模板参数是分配器 - 你的编译器可能会弄清楚你想说的是什么,声明无论如何都是错误的。你可能想要的是某种地图类型,就像iammilind建议的那样。