Как реализовать 2D векторный массив? - PullRequest
23 голосов
/ 14 марта 2012

Я впервые использую векторный класс в библиотеке STL. Как мне добавить к определенной строке векторного массива?

struct x{
     vector <vector <int> > v;
     int row;
 };

vector< int* > my ints;
int add;

если бы я хотел добавить в первую строку v первый указатель целых чисел, могу ли я сделать

myints[0]->v[myints[0]->row].push_back(add);

Хорошо ли этот метод для создания двухмерного вектора вектора int с, где каждая строка потенциально может иметь разную длину (т. Е. Иметь разное количество столбцов)?

Ответы [ 7 ]

61 голосов
/ 14 марта 2012

Я не совсем уверен, в чем проблема, так как в вашем примере кода есть несколько ошибок, и он не совсем проясняет, что вы пытаетесь сделать. Но вот как вы добавляете к определенной строке 2D вектора:

// declare 2D vector
vector< vector<int> > myVector;
// make new row (arbitrary example)
vector<int> myRow(1,5);
myVector.push_back(myRow);
// add element to row
myVector[0].push_back(1);

Это отвечает на ваш вопрос? Если нет, не могли бы вы попытаться конкретизировать, с чем у вас проблемы?

42 голосов
/ 27 июня 2015

Если вы заранее знаете (максимальное) количество строк и столбцов, вы можете использовать resize(), чтобы инициализировать вектор векторов, а затем изменить (и получить доступ) к элементам с помощью operator[] . Пример:

int no_of_cols = 5;
int no_of_rows = 10;
int initial_value = 0;

std::vector<std::vector<int>> matrix;
matrix.resize(no_of_rows, std::vector<int>(no_of_cols, initial_value));

// Read from matrix.
int value = matrix[1][2];

// Save to matrix.
matrix[3][1] = 5;

Другая возможность заключается в использовании только одного вектора и разделении идентификатора на несколько переменных, например, vector[(row * columns) + column].

9 голосов
/ 06 июля 2016

Просто используйте следующие методы для создания двухмерного вектора.

int rows, columns;        

// . . .

vector < vector < int > > Matrix(rows, vector< int >(columns,0));

ИЛИ

vector < vector < int > > Matrix;

Matrix.assign(rows, vector < int >(columns, 0));

//Do your stuff here...

Это создаст матрицу размера строк * столбцов и инициализирует его нулями , потому что мы передаем ноль (0) в качестве второго аргумента в конструкторе, т.е. vector (columns, 0) .

6 голосов
/ 11 февраля 2017

// сначала инициализировать 2D-вектор

vector<vector<int>> matrix;

// инициализировать 1D-вектор, который вы хотите вставить в матрицу

vector<int> row;

// инициализация строки значениями

row.push_back(val1);

row.push_back(val2);

// теперь вставляем значения в матрицу

matrix.push_back(row);

// output- [[val1, val2]]

5 голосов
/ 04 июля 2017

Мы можем легко использовать вектор как 2d массив.Для этого мы используем метод resize ().Приведенный ниже код может помочь понять эту проблему.

Фрагмент кода:

#include<bits/stdc++.h>
using namespace std;

int main()
{
    ios::sync_with_stdio(false);
    int row, col;
    cin>>row>>col;

    vector <vector<int>> v;
    v.resize(col,vector<int>(row));

    //v = {{1,2,3}, {4,5,6}, {7,8,9}}; 

    /** input from use **/
    for(int i=0; i<row; i++)
    {
       for(int j=0; j<col; j++)
       {
          cin>>v[i][j];
       }
    }

    for(int i=0;i<row; i++)
    {
       for(int j=0;j<col;j++)
       {
          cout<<v[i][j]<<" ";
       }
    }
    return 0;
}
2 голосов
/ 26 мая 2016

Я использую этот кусок кода. отлично работает для меня. Скопируйте его и запустите на своем компьютере. вы поймете сами.

#include <iostream>
#include <vector>
using namespace std;
int main()
{
    vector <vector <int> > matrix;
    size_t row=3 , col=3 ;
    for(int i=0,cnt=1 ; i<row ; i++)
    {
        for(int j=0 ; j<col ; j++)
        {
            vector <int> colVector ;
            matrix.push_back(colVector) ;
            matrix.at(i).push_back(cnt++) ;
        }
    }
    matrix.at(1).at(1) = 0;     //matrix.at(columns).at(rows) = intValue 
    //printing all elements
    for(int i=0,cnt=1 ; i<row ; i++)
    {
        for(int j=0 ; j<col ; j++)
        {
            cout<<matrix[i][j] <<" " ;
        }
        cout<<endl ;
    }
}
2 голосов
/ 13 марта 2016

Другим способом определения двумерного вектора является объявление вектора пары.

 vector < pair<int,int> > v;

**To insert values**
 cin >> x >>y;
 v.push_back(make_pair(x,y));

**Retrieve Values**
 i=0 to size(v)
 x=v[i].first;
 y=v[i].second;

Для 3-х векторов взгляните на кортеж и make_tuple.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...