0

我正在尝试将数据从一种容器类型复制到另一种容器类型,容器都是二维向量,我使用 boost::combine 和 boost::tie 来迭代容器,代码构建良好但抛出 bad_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;
}
4

1 回答 1

1

boost::combine期望传递的参数具有相同的大小。在您的情况下bv,有 1 个vector<int>bvv有 0 个类型的元素boost::container::small_vector。由于这个原因程序崩溃了。您可以添加1到构造函数small_vector

boost::container::small_vector<boost::container::small_vector<int, 4>, 1> bvv(1);

然后程序可以工作,但它并没有达到您的预期。v2向量在主函数中创建为新的局部变量,并由bv容器中的第一个向量的元素填充。我想你想用容器中bvv的元素填充向量。bv

如果要修改bvv向量,应将其作为参数传递给boost::tie函数。

    BOOST_FOREACH(boost::tie(bv[0], bvv[0]), boost::combine(bv, bvv)){
       std::copy (bv[0].begin(), bv[0].end(), std::back_inserter(bvv[0]));
    }

但它只有在bvv并且bv只有一个元素时才有效。

也许您不应该使用boost::combine而只是编写循环来遍历所有元素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()));
    }
于 2018-03-15T08:20:44.443 回答