7

C ++ std :: mapには.resize()メンバー関数がないので、疑問に思っていたのですが、最大n個の要素を持つstd::mapを取得するにはどうすればよいでしょうか。

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

ループを必要とせず(少なくとも私のユーザーコードでは)、より「STLの方法」であるソリューションがあるかどうか疑問に思いました。

4

5 に答える 5

14

あなたはそのために使うことができますstd::advance( iter, numberofsteps )

于 2009-11-27T15:03:55.293 に答える
3

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());
}
于 2009-11-27T15:20:56.757 に答える
1

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());
于 2009-11-27T16:19:14.343 に答える
0

マップのサイズを変更したいのはなぜですか?

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

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

于 2009-11-27T15:03:05.840 に答える
-1

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

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

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

于 2009-11-27T15:05:00.933 に答える