C++, как скопировать карту в вектор [дубликат]

Попробуйте ниже, сначала он создает пустой ряд, а затем объединяет его с серией value_counts:

pd.Series(0, index=list).combine(df.value_counts(), max)

18
задан Jack BeNimble 26 March 2009 в 04:08
поделиться

7 ответов

Это должно сделать то, что Вы хотите:

#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;
}
21
ответ дан 30 November 2019 в 06:02
поделиться
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>.

27
ответ дан 30 November 2019 в 06:02
поделиться

Если Вы используете станд.:: карта, это уже отсортировано по ключу. Просто создайте итератор и выполните итерации по карте от, начинают () заканчиваться (), и Вы сделаны.

Если требуется отсортировать по чему-то другому, чем ключ карты, можно использовать тот же итератор и продвинуть копию каждого элемента на вектор, как Вы выполняете итерации по карте.

6
ответ дан 30 November 2019 в 06:02
поделиться

Принятие Вас хочет скопировать ключ и значение:

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());
2
ответ дан 30 November 2019 в 06:02
поделиться

A map хранит пару - ключ и значение. Какую часть Вы хотите скопировать? Или, сделайте Вы хотите скопировать обоих в два отличных vectors?

Я хочу скопировать обоих. После того как это сделано, я должен выяснить, как отсортировать вектор по второму значению в паре.

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());
2
ответ дан 30 November 2019 в 06:02
поделиться

Если Ваша цель состоит в том, чтобы только отсортировать по типу вместо ключа, Вы могли бы хотеть посмотреть на Повышение:: Bimap. Это позволяет Вам доступ обе части пары карты как ключи. По-видимому, Вы могли выполнить итерации по нему в порядке второго ключа так же легко как первое.

2
ответ дан 30 November 2019 в 06:02
поделиться

Можно использовать другую карту (или установить), и использование преобразовывают, чтобы сделать сортировку, поскольку Вы вставляете:

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

Я забыл добавлять, что, если необходимо сделать это много затем, могло бы быть лучше только использовать мультииндексный контейнер повышения.

0
ответ дан 30 November 2019 в 06:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: