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());
}
The correct way for this is to use std::advance. But here is a funny (slow) way allowing to 'use resize on map'. More generally, this kind of trick can be used for other things working on vector but not on map.
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());
マップのサイズを変更したいのはなぜですか?
マップ内の要素は任意の順序で保存されません-最初の「n」は実際には何も意味しません
編集:
興味深いことに、std :: mapには順序がありますが、この概念がどれほど役立つかはわかりません。
エントリはキーと同じソート順ですか?
どういう意味ですか?SSNでキー設定された名前がある場合、それは名前がSSNの番号順に保存されることを意味しますか?
std::mapはリストではありません。「最初のn」個の要素はありません。
ところで:コンテナが変更されると、イテレータは無効になります。
より小さなマップが本当に必要な場合は、それを繰り返し処理して、n番目までのすべての要素を新しいマップに追加できます。