将std ::映射复制到std ::对向量

Copy std::map into std::vector of pairs

本文关键字:std 向量 映射 复制      更新时间:2023-10-16

我正在尝试将映射复制到配对的向量中,因此我可以通过对的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>的向量。什么是最好的方法?

只需使用 std::vector's 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());

值得注意的是,如果您是为此目的创建向量,则可以直接使用向量的构造函数:

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

在C 17中,您也可以省略向量的模板参数使编译器推断出来:

std::vector vectorWordsList( mappedWordsList.begin(), mappedWordsList.end() );

您可以使用std::copystd::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上进行预先分配内存,避免不必要的重新分解。