我们有一个映射,其中键和值都是int类型。我们必须在地图中搜索特定值并在一个向量中收集这些键。 代码快照就像
map<int,int>m;
map<int,int>::iterator itr;
vector<int> v;
m.insert(make_pair<int,int>(1,2));
m.insert(make_pair<int,int>(2,2));
m.insert(make_pair<int,int>(3,2));
m.insert(make_pair<int,int>(4,4));
m.insert(make_pair<int,int>(5,5));
目前的代码如下:
for ( itr = m.begin(); itr != m.end(); ++itr )
{
if ((*itr).second == 2 )
v.push_back((*itr).first )
}
我们想优化它。我们如何处理STL算法。
答案 0 :(得分:3)
在我看来,你这样做是错误的,你可能想要一个多图。
std::multimap<int,int> m;
std::vector<int> v;
m.insert(std::make_pair<int,int>(2,1));
m.insert(std::make_pair<int,int>(2,2));
m.insert(std::make_pair<int,int>(2,3));
m.insert(std::make_pair<int,int>(4,4));
m.insert(std::make_pair<int,int>(5,5));
typedef std::multimap<int,int>::iterator iterator;
std::pair<iterator, iterator> bounds = m.equal_range(2);
for(iterator it = bounds.first; it != bounds.second; ++it)
v.push_back(it->second);
答案 1 :(得分:0)
您可以将键与值交换(=所有值都是不同的)吗?如果是这样,那么您可以使用map.find()(即O(log n))来搜索项目。如果不是你写的代码是正确的方法。
另一种方法是在地图填充值时创建向量,但这假设在插入时已知过滤条件。
答案 2 :(得分:0)
假设你确实拥有很多,有boost multi_index
,虽然它只是成对的一组,但维护两张地图可能不再需要工作,后者是multimap< int, int >
,或map< int, set< int > >
将起作用
答案 3 :(得分:0)
如果可以改变任何要求,即可以交换键值,可以使用map<int, vector<int> >
并通过将数据推入对应于该键的向量来构建映射。这样就可以在构建地图时对其进行优化。
如果要求不能像OP在其中一条评论中所说的那样改变,那么我认为优化的余地不大。