2010-12-01 8 views
0

キーと値の両方がint型のマップが1つあります。マップ内の特定の値を検索し、それらのキーを1つのベクトルで収集する必要があります。 コードのスナップショットは、同じタイプのマップ値を収集する方法

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アルゴリズムをどうすればできるのですか?

答えて

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); 
+0

はい、OPはキーを値と値としてキーをキーとして使用しようとしているようです。 – Gorpik

+0

一つのシナリオではこれが必要です。それ以外の場合は、キーだけで作業しているマップです。 – CrazyC

+0

次にboost :: bimapを見てみましょう。 – ronag

0

キーを値(=すべての値は区別されます)と入れ替えることはできますか?そうならmap.find()(O(log n))を使って項目を検索することができます。そうでない場合は、あなたが書いたコードが正しいアプローチです。

もう1つのアプローチは、地図が値で満たされるときにベクトルを作成することですが、これは挿入時にフィルタの基準が分かっていることを前提としています。それだけでintのペアであることと、おそらく二つのマップを維持するために、これ以上の作業できなくなりますが、あなたは本当に、後者が動作するmultimap< int, int >、またはmap< int, set<int> >され、boost multi_indexがあり、それらの多くを持っていないと仮定

0

すべての要件を変更できる場合、つまりキー値を交換することができる場合は、map<int, vector<int> >を使用して、そのキーに対応するベクトルにデータをプッシュしてマップを構築できます。このようにして、マップ自体を構築しながら最適化することができます。

OPがコメントの1つで言ったように要件を変更できない場合は、最適化の範囲があまりないと思います。

関連する問題