Двумерный массив с использованием вектора
Я хочу создать 2D-массив, используя вектор. Но, когда я это делаю, я получаю ошибку.
Кто-нибудь может объяснить, что я делаю неправильно, и возможное решение этой проблемы.
Я сделал все публично, так как теперь я не хочу иметь дело с геттерами и сеттерами.
Я хочу, чтобы концепция 2D-массива была прозрачной.
#include <iostream>
#include <vector>
using namespace std;
class point
{
public:
point():x(0),y(0){}
~point(){}
point(float xx,float yy):x(xx),y(yy){}
float x,y;
};
int main()
{
vector<vector<point> > a; // 2D array
point p(2,3);
a[0][0] = p; // error here
return 0;
}
Ответы
Ответ 1
Ваш вектор пуст. Поэтому вы не можете использовать [0][0]
.
Вот как вы его объявляете:
a.push_back(vector<point>());
a[0].push_back(p);
Если вы знаете, сколько элементов у вас будет с самого начала, вы можете сделать:
vector<vector<point> > a(10, vector<point>(10));
Это вектор, содержащий 10 векторов, содержащих 10 точек. Затем вы можете использовать
a[4][4] = p;
Однако я считаю, что использование вектора векторов сбивает с толку. Если вам нужен массив, подумайте об использовании uBLAS http://www.boost.org/doc/libs/1_41_0/libs/numeric/ublas/doc/index.htm
#include <boost/numeric/ublas/matrix.hpp>
#include <boost/numeric/ublas/io.hpp>
int main () {
using namespace boost::numeric::ublas;
matrix<double> m (3, 3);
for (unsigned i = 0; i < m.size1 (); ++ i)
for (unsigned j = 0; j < m.size2 (); ++ j)
m (i, j) = 3 * i + j;
std::cout << m << std::endl;
}
Ответ 2
Вот еще одно предложение. То, что вы пытаетесь выполнить, было сделано раньше и может быть найдено в Boost Multi-Array.
Ответ 3
Вы построили вектор векторов, который пуст, и попытались разыменовать первый элемент без добавления в него каких-либо элементов.
Векторы не работают как (некоторые) ассоциативные массивы, где попытка получить доступ к отсутствующему значению добавит его в коллекцию. Вы должны убедиться, что векторы имеют соответствующее количество записей, прежде чем пытаться получить к ним доступ, используя соответствующую форму векторного конструктора или используя push_back.
Ответ 4
Вы создаете свой 2D-массив просто отлично. Проблема в том, что когда вы его создаете, это пустой массив - он еще не имеет точек. Вы пытаетесь использовать точку в [0] [0], прежде чем на самом деле создали там точку. Обычно, чтобы поместить новый элемент в вектор, вы можете использовать resize()
для установки размера вектора или push_back()
для добавления элементов по одному. В этом случае последний, вероятно, будет немного неуклюжим - поскольку у вас есть вектор векторов точки, вам нужно создать вектор точки, направить точку на этот вектор, а затем направить этот вектор на ваш массив.
Ответ 5
Удалось заставить его работать. Поднял идею "typedef" из другого места. Попробуйте приведенный ниже код, он работает:
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <vector>
using namespace std;
int main()
{
int i = 0;
int j = 0;
///////////////////////////////////////////////////////////
typedef vector<string> vecRow;
typedef vector<vecRow> vecCol;
vecRow vr;
vecCol vc;
///////////////////////////////////////////////////////////
// Assigning string elements to the 2d array
for(i=0;i<10;i++)
{
for(j=0;j<5;j++)
{
vr.push_back("string ["+to_string(i)+"]["+to_string(j)+"]");
}
vecRow vr_temp = vecRow(vr);
vc.push_back(vr_temp);
vr.clear();
}
///////////////////////////////////////////////////////////
// Printing back the elements from the 2D array
for(auto element : vc)
{
for(unsigned int ictr = 0;ictr < element.size() ; ictr++)
{
cout<<element[ictr]<<"\t";
}
cout<<endl;
}
getchar();
return 0;
}
Ответ 6
Вы можете определить vectorMatrix [] [], которая является матрицей векторов следующим образом.
Класс:
class vectorMatrix
{
std::vector<object> **cell;
int columns;
int rows;
public:
vectorMatrix(int columns, int rows);
virtual ~vectorMatrix();
void addCellAt(int row, int column, const object& entry);
virtual std::vector<object>* getCell(int row, int column);
void clearMatrix();
};
Определить конструктор:
vectorMatrix::vectorMatrix(int columns, int rows)
{
this->columns = columns;
this->rows = rows;
cell = new std::vector<object>* [columns];
for (int i = 0; i < columns; i++)
{
cell[i] = new std::vector<object>[rows];
}
}
Метод добавления записи:
void vectorMatrix::addCellAt(int row, int column, const object& entry)
{
cell[channel][timeSlot].push_back(entry);
}
Получение указателя на вектор в заданной строке и столбце:
std::vector<object>* vectorMatrix::getCell(int row, int column)
{
return &cell[row][column];
}
Очистка всей матрицы:
void vectorMatrix::clearMatrix()
{
for (int tmpRow = 0; tmpRow < columns; tmpRow ++)
{
for(int tmpColumn = 0; tmpColumn < rows; tmpColumn ++)
{
cell[tmpRow][tmpColumn].clear();
}
}
}
Ответ 7
Вы можете использовать resize()
; например, здесь я изменяю размер a
до массива 100 x 200:
vector<vector<point> > a; // 2D array
a.resize(100);
for_each(a.begin(),a.end(),[](vector<point>& v){v.resize(200);});
point p(2,3);
a[0][0] = p; // ok now
Ответ 8
Самый простой способ - использовать метод resize()
следующим образом:
vector <vector<int>> v;
cin>>n>>m; //n is rows and m is columns
v.resize(n,vector<int>(m));
for(i=0;i<n;i++) // inserts elements into the vector v
for(j=0;j<m;j++)
cin>>v[i][j];
for(i=0;i<n;i++) //accesses elements of vector v
for(j=0;j<m;j++)
cout<<v[i][j]<<" ";
Ответ 9
Самый простой способ использования вектора в качестве массива C-стиля
int z =0;
vector<vector<int>> vec(5,5);
for(int i =0; i < 5; i++)
{
for(int j=0; j<5; j++)
{
vec[i][j] = ++z;
}
}
for(int i =0; i < x; i++)
{
for(int j=0; j<x; j++)
{
cout<<vec[i][j]<<" ";
}
}