Я новичок в 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());
В интернете я могу найти только примеры multiarray, которые используют int, doule и так далее. Можно ли использовать std :: vector в множественном массиве? Я знаю, что могу использовать 3D-массив, но я бы предпочел векторы как elemet.
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
Других решений пока нет …