Ініціалізація двовимірного 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(). Ось
андре

Було б добре, якби принаймні один із відповідей не передбачав копіювання внутрішнього вектора: memset швидше, ніж memcpy (і calloc ще краще, якщо новий оператор буде вбудований).
Марк Гліссе

Відповіді:


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

Що робити , якщо я роблю клас зберігання в std :: vector <std :: vector <int>>якості 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));

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

Приклади вже були вказані в інших відповідях ....!


3

Я думаю, що найпростіший спосіб зробити це:

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

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


2

Припустимо, ви хочете ініціалізувати двовимірний цілий вектор з n рядками та m стовпцем, кожен з яких має значення " 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-вектора.


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;
    }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.