Инициализация двухмерного std :: vector

116

Итак, у меня есть следующее:

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);
    }

И это очень неправильно ... Есть ли другой способ инициализировать такой вектор?

Ференц Деак
источник
4
Я бы порекомендовал реализацию 1d вектора для 2d вектора, если вам не требуется больше места, чем std::vector<int>::max_size(). Здесь
andre
Было бы неплохо, если бы хотя бы один из ответов не касался копирования внутреннего вектора: memset работает быстрее, чем memcpy (а calloc даже лучше, если оператор new будет встроен).
Марк Глисс,

Ответы:

199

Используйте 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 } };
hmjd
источник
Что, если я сделаю класс хранения std :: vector <std :: vector <int>>as static?
нападающие
40

Допустим, вы хотите инициализировать 2D-вектор m * n с начальным значением 0

мы могли бы сделать это

#include<iostream>
int main(){ 
    int m = 2, n = 5;

    vector<vector<int>> vec(m, vector<int> (n, 0));

    return 0;
}
Джейсон
источник
Только что получил "Хороший ответ" из-за этого ответа. Другие люди уже дали такой же ответ, но те, кто проголосовали за этот, могут быть похожи на меня, когда я пришел к этому сообщению, что мы не узнали, что некоторые другие ответы на самом деле являются тем же ответом. Я думаю, это может быть по трем причинам: 1) этот код можно скопировать, вставить и сразу запустить; 2) std::делает его длиннее, и людям может понравиться короткий и прямой ответ; 3) длинное название переменной смущает новичков. Я тоже новичок, не знаю, насколько важны нам нужны std::, нужен работающий код, поэтому я знаю, что делает каждая переменная
Джейсон
35

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

std::vector<std::vector<int>> fog(A_NUMBER, std::vector<int>(OTHER_NUMBER));
juanchopanza
источник
8

Общий синтаксис, как уже было показано, следующий:

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]
     }
}

Примеры уже приводились в других ответах ....!

sarthakgupta072
источник
3

Я думаю, что самый простой способ сделать это:

std::vector<std::vector<int>>v(10,std::vector<int>(11,100));

10 - это размер внешнего или глобального вектора, который является основным, а 11 - это размер внутреннего вектора типа int, а начальные значения инициализируются равными 100! Это моя первая помощь в стеке, думаю, это кому-то поможет.

Мухирва Габо Оресте
источник
2

Предположим , вы хотите инициализировать двумерный целочисленный вектор с п строками и т столбце каждая из которых имеет значение « VAL »

Напишите это как

std::vector<vector<int>> arr(n, vector<int>(m,VAL));

Этот VAL может быть переменной целочисленного типа или константой, например 100.


источник
1

Рекомендуемый подход - использовать конструктор заливки для инициализации двумерного вектора с заданным значением по умолчанию:

std::vector<std::vector<int>> fog(M, std::vector<int>(N, default_value));

где M и N - размеры вашего 2D-вектора.

Smit
источник
1

Мой c++ STLкод инициализирует 5*3 2-D vectorсzero


#include <iostream>
using namespace std;
#include <vector>
int main()
{// if we wnt to initialise a 2 D vector with 0;

    vector<vector<int>> v1(5, vector<int>(3,0));

    for(int i=0;i<v1.size();i++) 
{
        for(int j=0;j<v1[i].size();j++)

           cout<<v1[i][j]<<" ";

            cout<<endl;
    }
}
Ритик Камбой
источник