std :: mapの最初のn個の要素を取得する方法
質問
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番号順に保存されますか?