質問

C ++ std :: mapには.resize()メンバー関数がないため、最大n個の要素を含むstd :: mapを取得する方法について疑問に思っていました。

明らかな解決策は、0からnまでのループを作成し、n番目のイテレーターをstd :: erase()の最初のパラメーターとして使用することです。

ループを必要としないソリューション(少なくともユーザーコードにはない)があり、「STLを使用する方法」に近いソリューションがあるかどうか疑問に思っていました。

役に立ちましたか?

解決

そのために std :: advance(iter、numberofsteps)を使用できます。

他のヒント

ほとんどすべてのコンテナ(std :: list、std :: map、boost :: multi_indexなど)の汎用ソリューション。地図のサイズのみを確認する必要があります。

template<class It>
It myadvance(It it, size_t n) {
   std::advance(it, n);
   return it;
}

template<class Cont>
void resize_container(Cont & cont, size_t n) {
    cont.erase(myadvance(cont.begin(), std::min(n, cont.size())), 
                 cont.end());
}

これの正しい方法は、std :: advanceを使用することです。しかし、これは「マップ上でサイズ変更を使用する」ことを可能にする面白い(遅い)方法です。より一般的には、この種のトリックは、マップ上ではなくベクトル上で動作する他のことに使用できます。

map<K,V> m; //your map
vector< pair<K,V> > v(m.begin(), m.end());
v.resize(n);
m = map<K,V>(v.begin(),v.end());

std :: mapはリストではありません。 「最初のn」はありません。要素。

ところで:コンテナが変更されると、イテレータは無効になります。

本当に小さなマップが必要な場合は、それを繰り返して、n番目までのすべての要素を新しいマップに追加できます。

マップのサイズを変更する理由

マップ内の要素は任意の順序で格納されません-最初の「n」は実際には何も意味しません

編集:
興味深いことに、std :: mapには順序がありますが、この概念がどれほど役立つかはわかりません。
エントリはキーと同じソート順ですか?
どういう意味ですか? SSNでキー入力された名前がある場合、名前はSSN番号順に保存されますか?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top