Увеличение мультимассива std::vector

Я новичок в 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 и так далее. Можно ли использовать std::vector в mutliarray? Я знаю, что мог бы использовать трехмерный мультимассив, но я бы предпочел векторы в качестве элемента.


person DanS    schedule 14.05.2013    source источник


Ответы (1)


Boost.MultiArray поддерживает std::vector элементов. Как правило, Boost.MultiArray выполняет проверку концепции во время компиляции. Таким образом, если код компилируется с полным типом, он должен поддерживаться.

С mImage[0][0].origin():

  • mImage[0][0] возвращает ссылку на std::vector<Vector3_t>.
  • origin() не является функцией-членом std::vector<Vector3_t>, что приводит к ошибке.

origin() — это функция-член multi-array, которая возвращает адрес хранилища первого элемента. В случае, когда массив не был переиндексирован до положительного индекса, это эквивалентно 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
person Tanner Sansbury    schedule 14.05.2013