2013-07-15 3 views
44

Итак, у меня есть следующий:Инициализация двумерный зОго :: вектора

std::vector< std::vector <int> > fog; 

и я инициализация очень наивно нравится:

for(int i=0; i<A_NUMBER; i++) 
    { 
      std::vector <int> fogRow; 
      for(int j=0; j<OTHER_NUMBER; j++) 
      { 
       fogRow.push_back(0); 
      } 
      fog.push_back(fogRow); 
    } 

И он чувствует себя очень неправильно ... Это есть еще один способ инициализации такого вектора?

+1

Я бы порекомендовал реализацию 1d вектора для 2d-вектора, если вам не требуется больше места, чем 'std :: vector :: max_size()'. [Здесь] (http://stackoverflow.com/a/13937325/942596) – andre

ответ

93

Используйте std::vector::vector(count, value) конструктор, который принимает первоначальный размер и значение по умолчанию:

std::vector<std::vector<int> > fog(
    A_NUMBER, 
    std::vector<int>(OTHER_NUMBER)); // Defaults to zero initial value 

Если значение, отличное от нуля, говорят 4, например, должен был быть по умолчанию, то:

std::vector<std::vector<int> > fog(
    A_NUMBER, 
    std::vector<int>(OTHER_NUMBER, 4)); 

Следует также отметить, что в C++ 11 введена унифицированная инициализация, которая позволяет инициализировать vector и другие контейнеры, используя {}:

std::vector<std::vector<int> > fog { { 1, 1, 1 }, 
            { 2, 2, 2 } }; 
23

Там нет append метода std::vector, но если вы хотите, чтобы вектор, содержащий A_NUMBER векторов int, каждый из тех, которые содержат other_number нулей, то вы можете сделать это:

std::vector<std::vector<int>> fog(A_NUMBER, std::vector<int>(OTHER_NUMBER)); 
+0

о приложении: просто опечатка :) спасибо! – fritzone

+0

Это работает для нас, – mxi1

0

Общим синтаксис, как показано уже:

std::vector<std::vector<int> > v (A_NUMBER, std::vector <int> (OTHER_NUMBER, DEFAULT_VALUE)) 

Здесь вектор «v» можно представить в виде двумерного массива, с «A_NUMBER» из строк, с столбцами «OTHER_NUMBER» с их начальным значением, установленным в «DEFAULT_VALUE».

Кроме того, она может быть записана следующим образом:

std::vector <int> line(OTHER_NUMBER, DEFAULT_VALUE) 
std::vector<std::vector<int> > v(A_NUMBER, line) 

ввода значения в векторе 2-D похож на ввод значений в 2-D массиве:

for(int i = 0; i < A_NUMBER; i++) { 
    for(int j = 0; j < OTHER_NUMBER; j++) { 
     std::cin >> v[i][j] 
    } 
} 

Примеры уже заявил в других ответах ....!

Смежные вопросы