C ++如何将地图复制到矢量

时间:2009-03-26 04:00:38

标签: c++ collections vector map

C ++中将一对从地图复制到矢量的最佳方法是什么?我这样做,所以我可以随后对矢量进行排序。

7 个答案:

答案 0 :(得分:26)

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>

答案 1 :(得分:20)

这应该做你想要的:

#include <iostream>
#include <vector>
#include <map>
#include <algorithm>
#include <iterator>

using namespace std;

bool cmp(const pair<int, int>  &p1, const pair<int, int> &p2)
{
    return p1.second < p2.second;
}

int main()
{
    map<int, int> m;
    for(int i = 0; i < 10; ++i)
        m[i] = i * -i;

    vector<pair<int, int> > v;
    copy(m.begin(), m.end(), back_inserter(v));

    sort(v.begin(), v.end(), cmp);

    for(int i = 0; i < v.size(); ++i)
        cout << v[i].first << " : " << v[i].second << endl;
    return 0;
}

答案 2 :(得分:6)

如果你使用的是std :: map,它已经按键排序了。只需创建一个迭代器并遍历地图从begin()到end(),然后就完成了。

如果您想要使用地图键以外的其他内容进行排序,则可以使用相同的迭代器,并在迭代地图时将每个元素的副本推送到矢量上。

答案 3 :(得分:2)

map存储一对 - 一个键和一个值。你要复制哪一部分?或者,您是否要将两者都复制到两个不同的vector

  

我想复制两者。一旦完成,我需要弄清楚如何通过对中的 second 值对矢量进行排序。

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());

答案 4 :(得分: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());

答案 5 :(得分:2)

如果您的目的只是按类型而不是键进行排序,您可能需要查看Boost::Bimap。它允许您作为键访问地图对的两个部分。据推测,您可以按照第二个键的顺序迭代它,就像第一个键一样容易。

答案 6 :(得分: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 ());
}

我忘了补充一点,如果你需要做很多事情,那么使用boost multi-index容器可能会更好。