20

ペアをマップからベクトルにコピーする C++ の最良の方法は何ですか? これを行っているのは、後でベクターをソートできるようにするためです。

4

7 に答える 7

28
vector<pair<K,V> > v(m.begin(), m.end());

また

vector<pair<K,V> > v(m.size());
copy(m.begin(), m.end(), v.begin());

copy()です<algorithm>

于 2009-03-26T04:12:19.417 に答える
6

std::map を使用している場合は、既にキーでソートされています。イテレータを作成し、マップを begin() から end() まで繰り返すだけで完了です。

マップ キー以外で並べ替えたい場合は、同じ反復子を使用して、マップを反復処理するときに各要素のコピーをベクターにプッシュできます。

于 2009-03-26T04:05:16.017 に答える
2

Amapにはキーと値のペアが格納されます。どの部分をコピーしますか? または、両方を 2 つの異なる にコピーしますvectorか?

両方コピーしたい。それが完了したら、ペアの2 番目の値でベクトルを並べ替える方法を理解する必要があります。

template <class V>
struct sort_by_val {
  bool operator()(V const& l, V const& r) {
        return // ...
  }
};

vector<pair<K, V> > outv(map.begin(), map.end());

sort(outv.begin(), outv.end(), sort_by_val());
于 2009-03-26T04:02:07.943 に答える
2

キーではなくタイプでソートするだけの場合は、Boost::Bimapを参照してください。マップ ペアの両方の部分にキーとしてアクセスできます。おそらく、最初のキーと同じくらい簡単に、2 番目のキーの順に反復処理できます。

于 2009-03-26T10:48:33.363 に答える
2

キーと値をコピーするとします。

std::map<Foo, Bar> m;


// Map gets populated 
// (...)


// Copying it to a new vector via the constructor
std::vector<std::pair<Foo, Bar>> v(m.begin(), m.end());


// Copying it to an existing vector, erasing the contents
v.assign(m.begin(), m.end());

// Copying it to the back of an existing vector
v.insert(v.end(), m.begin(), m.end());
于 2009-03-26T04:12:43.847 に答える
0

別のマップ (またはセット) を使用し、transform を使用して、挿入時に並べ替えを行うことができます。

#include <map>
#include <algorithm>

typedef std::map<unsigned int, signed char> MapType1;
typedef std::map<MapType1::mapped_type, MapType1::key_type> MapType2;

struct SwapPair
{
  MapType2::value_type operator()(MapType1::value_type const & v)
  {
    return std::make_pair (v.second, v.first);
  }
};

int main ()
{
  MapType1 m1;
  for(int i = 0; i < 10; ++i)
    m1[i] = i * -i;

  MapType2 m2;
  std::transform (m1.begin ()
      , m1.end ()
      , std::inserter (m2, m2.end ())
      , SwapPair ());
}

これを頻繁に行う必要がある場合は、ブーストマルチインデックスコンテナーを使用する方がよいかもしれないことを付け加えるのを忘れていました。

于 2009-03-26T11:02:28.603 に答える