我想用vector创建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;
}
答案 0 :(得分:46)
你的矢量是空的。所以你不能使用[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;
}
答案 1 :(得分:12)
这是另一个建议。您之前已经完成的工作已经完成,可以在Boost Multi-Array内找到。
答案 2 :(得分:7)
你构建了一个空的向量向量,并尝试取消引用第一个元素而不向其添加任何元素。
向量不像(某些)关联数组那样工作,尝试访问缺少的值会将其添加到集合中。在尝试使用适当形式的向量构造函数或使用push_back访问它们之前,您需要确保向量具有适当数量的条目。
答案 3 :(得分:3)
你正在创建2D数组。问题是,当你创建它时,它是一个空数组 - 它根本就没有任何点。在实际创建点之前,尝试使用 [0] [0]处的点。通常,要将新元素放入向量,可以使用resize()
设置向量的大小,或使用push_back()
一次添加一个项目。在这种情况下,后者可能有点笨拙 - 因为你有一个点矢量矢量,你需要创建一个点矢量,将一个点推到该矢量上,然后将该矢量推到你的数组上。
答案 4 :(得分:1)
管理以使其正常运行。从其他地方接受了'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;
}
答案 5 :(得分:1)
最简单的方法是使用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]<<" ";
答案 6 :(得分:0)
您可以定义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 :(得分:0)
您可以使用{
"MY_NEW_SITES": "Mes nouveaux sites"
}
;例如,在这里我将resize()
调整为100 x 200阵列:
a
答案 8 :(得分:-2)
将vector用作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]<<" ";
}
}