Инициализация двухмерного std::vector
Итак, у меня есть следующее:
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
Используйте конструктор 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));
Следует также упомянуть, что в С++ 11 введена единая инициализация, которая позволяет инициализировать vector
и другие контейнеры, используя {}
:
std::vector<std::vector<int> > fog { { 1, 1, 1 },
{ 2, 2, 2 } };
Ответ 2
В std::vector
нет метода append
, но если вы хотите создать вектор, содержащий A_NUMBER
векторы int
, каждый из которых содержит other_number
нули, вы можете сделать это:
std::vector<std::vector<int>> fog(A_NUMBER, std::vector<int>(OTHER_NUMBER));
Ответ 3
Допустим, вы хотите инициализировать 2D-вектор m * n с начальным значением 0
мы могли бы сделать это
#include<iostream>
int main(){
int m = 2, n = 5;
vector<vector<int>> vec(m, vector<int> (n, 0));
return 0;
}
Ответ 4
Общий синтаксис, как показано на рисунке:
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)
Ввод значений в двухмерном векторе аналогичен вводу значений в двухмерном массиве:
for(int i = 0; i < A_NUMBER; i++) {
for(int j = 0; j < OTHER_NUMBER; j++) {
std::cin >> v[i][j]
}
}
Примеры уже были указаны в других ответах....!
Ответ 5
Я думаю, что самый простой способ сделать это:
std::vector<std::vector<int>>v(10,std::vector<int>(11,100));
10 - это размер внешнего или глобального вектора, который является основным, а 11 - размер внутреннего вектора типа int, а начальные значения инициализируются равными 100! Это моя первая помощь в стеке, думаю, кому-то это поможет.