C++11 在不同类型的容器之间复制数据

C++11 在不同类型的容器之间复制数据,c++11,boost,boost-tuples,C++11,Boost,Boost Tuples,我试图将数据从一个容器类型复制到另一个容器类型,容器都是二维向量,我使用boost::combine和boost::tie对容器进行迭代,代码构建良好,但运行时抛出一个错误的alloc。我不明白为什么像下面这样的简单代码会抛出bad_alloc,我做错了什么??还有,当容器是多维的时,在容器之间复制数据的其他策略是什么 #include <vector> #include <iostream> #include <boost/foreach.hpp> #inc

我试图将数据从一个容器类型复制到另一个容器类型,容器都是二维向量,我使用boost::combine和boost::tie对容器进行迭代,代码构建良好,但运行时抛出一个错误的alloc。我不明白为什么像下面这样的简单代码会抛出bad_alloc,我做错了什么??还有,当容器是多维的时,在容器之间复制数据的其他策略是什么

#include <vector>
#include <iostream>
#include <boost/foreach.hpp>
#include <boost/container/small_vector.hpp>
#include <boost/range/combine.hpp>
#include <algorithm>
#include <tuple>

int
main(int ac, char **av)
{
    std::vector<std::vector<int>> bv(1, std::vector<int>(4, 99));
    boost::container::small_vector<boost::container::small_vector<int, 4>, 1> bvv;
    decltype(bv)::value_type v1;
    decltype(bvv)::value_type v2;
    BOOST_FOREACH(boost::tie(v1, v2), boost::combine(bv, bvv)){
        for ( auto &e : v1 )
            v2.push_back( e );
    }
    return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
int
主(内部交流,字符**av)
{
std::vector bv(1,std::vector(4,99));
boost::container::小_向量bvv;
decltype(bv):值\类型v1;
decltype(bvv):值\类型v2;
增压器(增压器:tie(v1,v2),增压器:联合收割机(bv,bvv)){
用于(自动和电气:v1)
v2.推回(e);
}
返回0;
}

boost::combine
要求传递的参数大小相同。在您的例子中,
bv
有1个
vector
但是
bvv
有0个
boost::container::small_vector
类型的元素。由于这个原因,程序崩溃了。您可以将
1
添加到
小向量的构造函数中

boost::container::small_vector<boost::container::small_vector<int, 4>, 1> bvv(1);
但只有当
bvv
bv
有一个元素时,它才起作用

也许您不应该使用
boost::combined
,而只是编写循环来迭代
bv
中的所有元素,并将它们添加到
bvv
容器中

    for (const auto& v : bv)
    {
        bvv.push_back(boost::container::small_vector<int, 4>());
        std::copy (v.begin(), v.end(), std::back_inserter(bvv.back()));
    }
for(const auto&v:bv)
{
bvv.push_back(boost::container::small_vector());
std::copy(v.begin()、v.end()、std::back_插入器(bvv.back());
}

但我使用的是boost::small_vector,它应该预分配和预保留大小???
small_vector
N表示预分配的元素,但没有调用
push_back
resize
等方法,它仍然有0个元素
N
用于为元素分配内存,然后使用
push_back
可能会更快,但您需要以显式方式添加元素。
    for (const auto& v : bv)
    {
        bvv.push_back(boost::container::small_vector<int, 4>());
        std::copy (v.begin(), v.end(), std::back_inserter(bvv.back()));
    }