Подтвердить что ты не робот

Двумерный массив с использованием вектора

Я хочу создать 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;
}
4b9b3361

Ответ 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]<<" ";
    }

}