C++ 如何在不复制的情况下将小向量集合转移到唯一向量中

C++ 如何在不复制的情况下将小向量集合转移到唯一向量中,c++,map,stl,C++,Map,Stl,我有一个map,比如T=char值是长度秒的向量; receipt.insert(receipt.end(),it->second.begin(),it->second.end()); } } 编辑:我用我的解决方案进行了编辑,但它确实进行了复制。如果您的向量包含任何便宜的可移动和昂贵的复制内容,您可以使用以下方法将每个小向量的内容移动到大向量中: 如果您的向量包含任何便宜的可移动和昂贵的复制内容,您可以使用以下方法将每个小向量的内容移动到大向量中: 正如我在评论中解释的那样,没有复制是不可能

我有一个
map
,比如
T=char
值是
长度秒的
向量;
receipt.insert(receipt.end(),it->second.begin(),it->second.end());
}
}

编辑:我用我的解决方案进行了编辑,但它确实进行了复制。

如果您的向量包含任何便宜的可移动和昂贵的复制内容,您可以使用以下方法将每个小向量的内容移动到大向量中:


如果您的向量包含任何便宜的可移动和昂贵的复制内容,您可以使用以下方法将每个小向量的内容移动到大向量中:


正如我在评论中解释的那样,没有复制是不可能的;地图中的每个向量都是一个单独管理的动态数组,新向量是一个新的大数组。必须复制这些值。我不会担心这个问题,除非你已经分析并看到这是一个重要的问题

本着这种精神,为了营救。。。德德,德德,达姆,达姆

#include <vector>
#include <map>
#include <algorithm>

template<typename T, size_t N>
size_t length(T (&)[N]) {
   return N;
}

int main()
{
    typedef std::vector<double> Vec;
    typedef std::map<char, vector<double> >::iterator ItMap;

    //create a map<char,vector<double>> with 2 keys holding resp 2-3 elem vectors
    double v_value[] = {1.1,2.4};
    Vec v(v_value, v_value + length(v_value));
    std::map<char,vector<double> > myMap;
    myMap['A'] = v;
    v.push_back(10);
    myMap['B'] = v;

    //create the vector that should get all the small vectors
    Vec receipt(10);

    for(ItMap it = myMap.begin(); it != myMap.end(); ++it) {
        std::copy(it->second.begin(), it->second.end(), std::back_inserter(receipt));
    }
}
#包括
#包括
#如果目标编译器支持C++11,则包括

我演示了一个计算数组长度的小技巧。。。我总是被
sizeof
弄糊涂


PS我讨厌
使用命名空间std

正如我在评论中解释的那样,不复制是不可能的;地图中的每个向量都是一个单独管理的动态数组,新向量是一个新的大数组。必须复制这些值。我不会担心这个问题,除非你已经分析并看到这是一个重要的问题

本着这种精神,为了营救。。。德德,德德,达姆,达姆

#include <vector>
#include <map>
#include <algorithm>

template<typename T, size_t N>
size_t length(T (&)[N]) {
   return N;
}

int main()
{
    typedef std::vector<double> Vec;
    typedef std::map<char, vector<double> >::iterator ItMap;

    //create a map<char,vector<double>> with 2 keys holding resp 2-3 elem vectors
    double v_value[] = {1.1,2.4};
    Vec v(v_value, v_value + length(v_value));
    std::map<char,vector<double> > myMap;
    myMap['A'] = v;
    v.push_back(10);
    myMap['B'] = v;

    //create the vector that should get all the small vectors
    Vec receipt(10);

    for(ItMap it = myMap.begin(); it != myMap.end(); ++it) {
        std::copy(it->second.begin(), it->second.end(), std::back_inserter(receipt));
    }
}
#包括
#包括
#如果目标编译器支持C++11,则包括

我演示了一个计算数组长度的小技巧。。。我总是被
sizeof
弄糊涂


PS我讨厌
使用命名空间std

不复制是不可能的;地图中的每个向量都是一个单独管理的动态数组,新向量是一个新的大数组。必须复制这些值。我不会担心这个问题,除非你已经分析并看到这是一个重要的问题。也许你可以创建某种代理对象来用作地图值而不是向量。代理将返回对大n*k向量中单元格的引用;地图中的每个向量都是一个单独管理的动态数组,新向量是一个新的大数组。必须复制这些值。我不会担心这个问题,除非你已经分析并看到这是一个重要的问题。也许你可以创建某种代理对象来用作地图值而不是向量。代理将返回对大n*k向量中单元格的引用。@Cornstales:不幸的是,这是不可能的。这是一个很好的解决方案,如果你想坚持做可能的事情。@Alex谢谢,我希望
swap
能有所帮助。我用我的答案编辑,但你的答案最后插入,我希望在适当的位置插入小向量(即:每个5个索引)…@statquant我明白你的意思,但是如果原始向量太小,你希望大向量保持什么
std::swap
在这里是无用的,因为
vector
的连续内存需求@Alex,0就可以了,这就是为什么我在我的“解决方案”@statquant中调整了它们的大小。在这种情况下,您的解决方案是最好的解决方案。@Cornstalks:不幸的是,这是不可能的。这是一个很好的解决方案,如果你想坚持做可能的事情。@Alex谢谢,我希望
swap
能有所帮助。我用我的答案编辑,但你的答案最后插入,我希望在适当的位置插入小向量(即:每个5个索引)…@statquant我明白你的意思,但是如果原始向量太小,你希望大向量保持什么
std::swap
在这里是无用的,因为
向量
@Alex的连续内存需求是可以的,0,这就是为什么我在我的“solution”@statquant中调整了它们的大小。在这种情况下,您的解决方案是最好的解决方案。
for(const auto& e : m) {
  std::copy(m.second.begin(), m.second.end(), std::back_inserter(big_vector));
}
#include <vector>
#include <map>
#include <algorithm>

template<typename T, size_t N>
size_t length(T (&)[N]) {
   return N;
}

int main()
{
    typedef std::vector<double> Vec;
    typedef std::map<char, vector<double> >::iterator ItMap;

    //create a map<char,vector<double>> with 2 keys holding resp 2-3 elem vectors
    double v_value[] = {1.1,2.4};
    Vec v(v_value, v_value + length(v_value));
    std::map<char,vector<double> > myMap;
    myMap['A'] = v;
    v.push_back(10);
    myMap['B'] = v;

    //create the vector that should get all the small vectors
    Vec receipt(10);

    for(ItMap it = myMap.begin(); it != myMap.end(); ++it) {
        std::copy(it->second.begin(), it->second.end(), std::back_inserter(receipt));
    }
}