Скопируйте std :: map в std :: vector пар - PullRequest
0 голосов
/ 19 декабря 2018

Я пытаюсь скопировать карту в вектор пары, чтобы затем можно было отсортировать вектор по элементу данных second пар.Я решил это следующим образом:

void mappedWordsListSorter(){
  for (auto itr = mappedWordsList.begin(); itr != mappedWordsList.end(); ++itr){
    vectorWordsList.push_back(*itr);
  }
  sort(vectorWordsList.begin(), vectorWordsList.end(), [=](pair<string, int>& a, pair<string, int>& b){return a.second > b.second;});
}

Мне нужно найти способ сделать это без использования необработанного цикла, используя вместо этого стандартную библиотеку.Я сталкивался с множеством примеров, делающих это, только передавая либо ключи, либо значения карты.Мне нужно скопировать в вектор pairs<string, int>.Каков наилучший способ сделать это?

Ответы [ 3 ]

0 голосов
/ 19 декабря 2018

Просто используйте std::vector assign функцию-член.

//no need to call reserve, bidirectional iterators or better will compute the size and reserve internally.
vectorWordsList.assign(mappedWordsList.begin(), mappedWordsList.end());

Если в векторе есть значения, которые вы не хотите перезаписывать, используйте insert вместо

vectorWordsList.reserve(vectorWordsList.size() + mappedWordsList.size()); // make sure we only have a single memory allocation
vectorWordsList.insert(vectorWordsList.end(), mappedWordsList.begin(), mappedWordsList.end());
0 голосов
/ 20 декабря 2018

Стоит отметить, что если вы создаете вектор для этой цели , вы можете напрямую использовать конструктор вектора:

std::vector<std::pair<FirstType,SecondType>> vectorWordsList( mappedWordsList.begin(), mappedWordsList.end() );

В C ++ 17 вы также можете опуститьаргументы шаблона вектора, чтобы компилятор выводил их:

std::vector vectorWordsList( mappedWordsList.begin(), mappedWordsList.end() );
0 голосов
/ 19 декабря 2018

Вы можете использовать std::copy и std::back_inserter:

std::copy(mappedWordsList.begin(), 
          mappedWordsList.end(), 
          std::back_inserter(vectorWordsList));

Честно говоря, я думаю, что цикл диапазона - for более понятен:

for(const auto& kv : mappedWordsList) 
     vectorWordsList.emplace_back(kv);

Независимо от того, выможно использовать std::vector::reserve для предварительного выделения памяти на вашей цели vector, избегая ненужных перераспределений.

...