我是Boost的新手(也是stackoverflow)并且想要使用多行向量。我这样做了:
typedef boost::multi_array<std::vector<Vector3_t>, 2> array_type;
array_type* mImage;
int mResolution = 1000;
mImage = new array_type (boost::extents[mResolution][mResolution]);
//works
mImage[0][0].origin()->push_back(Vector3_t());
//Error: abort()
mImage[1][1].origin()->push_back(Vector3_t());
//Error: abort()
mImage[500][440].origin()->push_back(Vector3_t());
在互联网上,我只能找到使用int,doule等的多阵列示例。是否有可能在mutliarray中使用std :: vector?我知道我可以使用3d多阵列,但我更喜欢矢量作为elemet。
答案 0 :(得分:2)
Boost.MultiArray支持std::vector
个元素。通常,Boost.MultiArray将在编译时执行概念检查。因此,如果代码使用完整类型进行编译,则应该支持它。
使用mImage[0][0].origin()
:
mImage[0][0]
会返回对std::vector<Vector3_t>
。origin()
不是std::vector<Vector3_t>
上的成员函数,导致错误。 origin()
是多数组的成员函数,它返回第一个元素存储的地址。如果数组尚未重新索引到正索引,则对于所有索引(即0
),这相当于mImage.origin() == &mImage[0][0]
。
这是一个简短而完整的例子,其中包含一个向量为向量的向量的多数组。
#include <iostream>
#include <vector>
#include <boost/foreach.hpp>
#include <boost/range/counting_range.hpp>
#include <boost/multi_array.hpp>
int main()
{
typedef std::vector<int> vector3_type;
typedef boost::multi_array<std::vector<vector3_type>, 2> array_type;
array_type array(boost::extents[5][5]);
// Insert vector into multi-array.
array[0][0].push_back(vector3_type());
// Insert range of [100,105) into the first vector at [0][0]
BOOST_FOREACH(const int& i, boost::counting_range(100, 105))
array[0][0].front().push_back(i);
// Print all integers at [0][0][0]
BOOST_FOREACH(const int& i, array[0][0][0])
std::cout << i << std::endl;
}
并且运行会产生以下预期输出:
100 101 102 103 104