在不同类型的容器之间复制数据
copying data between different types of containers
我正在尝试将数据从一种容器类型复制到另一种容器类型,容器都是双维向量,我正在使用 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;
}
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
向量在 main 函数中创建为新的局部变量,并由 bv
容器中的第一个向量的元素填充。我认为您想用 bv
容器中的元素填充 bvv
向量。
如果你想修改 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()));
}
我正在尝试将数据从一种容器类型复制到另一种容器类型,容器都是双维向量,我正在使用 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;
}
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
向量在 main 函数中创建为新的局部变量,并由 bv
容器中的第一个向量的元素填充。我认为您想用 bv
容器中的元素填充 bvv
向量。
如果你想修改 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()));
}