使用传染媒介的二维数组

时间:2009-12-02 14:11:29

标签: c++ stl

我想用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;
}

9 个答案:

答案 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]<<" ";
    }

}