在vector <std :: pair <int,vector <int =“”>&gt;中搜索&GT; </性病::对<INT,>

时间:2011-07-28 06:19:05

标签: c++

我想在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)上,以便获取与之关联的向量。

4 个答案:

答案 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建议的那样。