如何在列表中传输地图的内容而不复制它

How to transfer the content of a map in a list without copying it

本文关键字:复制 地图 列表 传输      更新时间:2023-10-16

我有一个相当大的map<double, vector<double>>,比如myMap。我想把myMap[.].second的含量放在list<vector<double> >vector<vector<double> >中。是否有可能在不显式复制每个vector元素的情况下做到这一点?我希望这是可行的iterators

#include <iostream>
#include <vector>
#include <map>
using namespace std;
int main()
{
    double v_value[] = {1.1,2.4};
    vector<double> v(v_value, v_value + sizeof(v_value)/sizeof(double));
    map<double,vector<double> > myMap;
    myMap[10.01] = v;
    myMap[14.62] = v;
}

在c++03中,您可以对映射中的每个向量使用std::vector::swap,将其转换为列表中的空向量。在c++ 11中,您可以从一种转换到另一种。两者都避免复制,但显然会修改源映射。

std::map<double, vector<double> > m = ....;
std::list<std::vector<double> > l(size_of_map); // list full of empty vectors
// iterate over map
typedef std::map<double, vector<double>>::iterator map_iter;
size_t list_counter = 0;
for(map_iter it = m.begin(); it != m.end(); ++it) {
    l[list_counter].swap(it->second);
    ++list_counter;
}
在c++ 11:

std::map<double, vector<double>> m = ....;
std::list<std::vector<double>> l; // empty list
for(auto it = m.begin(); it != m.end(); ++it) {
    l.push_back(std::move(it->second));
}