Есть ли способ указать размеры вложенного вектора STL C ++?

Я знаю, что векторы могут быть построены до предварительно определенного размера

vector<int> foo(4);

Но есть ли способ указать размеры вложенных векторов?

vector< vector<int> > bar(4);

Допустим, я хотел вектор размером 4, содержащим вектор размером 4 ... как многомерный массив целых 4x4?

8
задан zebraman 19 April 2010 в 07:55
поделиться

2 ответа

Второй аргумент этого конструктора - это значение для инициализации. Прямо сейчас вы получаете 4 вектора, сконструированные по умолчанию. Чтобы прояснить это на более простом примере 1D:

// 4 ints initialized to 0
vector<int> v1(4);

// *exactly* the same as above, this is what the compiler ends up generating
vector<int> v2(4, 0); 

// 4 ints initialized to 10
vector<int> v3(4, 10); 

Итак, вы хотите:

vector< vector<int> > bar(4, vector<int>(4));
//              this many ^   of these ^

Это создает вектор векторов целых чисел, инициализированный, чтобы содержать 4 вектора, которые инициализированы, чтобы содержать 4 целых числа, инициализированных в 0. (Вы можете указать значение по умолчанию. значение для int to, если желательно.)

Сытно, но не слишком сложно. :)


Для пары:

typedef std::pair<int, int> pair_type; // be liberal in your use of typedef
typedef std::vector<pair_type> inner_vec;
typedef std::vector<inner_vec> outer_vec;

outer_vec v(5, inner_vec(5, pair_type(1, 1)); // 5x5 of pairs equal to (1, 1)
//             this many ^ of these ^
//this many ^      of these ^
25
ответ дан 5 December 2019 в 06:22
поделиться

В качестве альтернативы std :: vector вы можете использовать boost :: multi_array . Из документации :

#include "boost/multi_array.hpp"
#include <cassert>

int 
main () {
  // Create a 3D array that is 3 x 4 x 2
  typedef boost::multi_array<double, 3> array_type;
  typedef array_type::index index;
  array_type A(boost::extents[3][4][2]);

  // Assign values to the elements
  int values = 0;
  for(index i = 0; i != 3; ++i) 
    for(index j = 0; j != 4; ++j)
      for(index k = 0; k != 2; ++k)
        A[i][j][k] = values++;

  // Verify values
  int verify = 0;
  for(index i = 0; i != 3; ++i) 
    for(index j = 0; j != 4; ++j)
      for(index k = 0; k != 2; ++k)
        assert(A[i][j][k] == verify++);

  return 0;
}
1
ответ дан 5 December 2019 в 06:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: