24 Stimmen

Zweidimensionales Array mit Vektor

Ich möchte ein 2D-Array mit Hilfe eines Vektors erstellen. Aber wenn ich dies tue, erhalte ich seg-Fehler. Kann mir jemand erklären, was ich falsch mache, und eine mögliche Lösung für dieses Problem.

Ich habe alles öffentlich gemacht, da ich mich jetzt nicht mit Gettern und Settern beschäftigen möchte. Ich möchte das Konzept der 2D-Array klar zu bekommen.

#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;
}

51voto

Tristram Gräbener Punkte 9391

Ihr Vektor ist leer. Sie können also nicht verwenden [0][0] .

So deklarieren Sie es:

a.push_back(vector<point>());
a[0].push_back(p);

Wenn Sie von Anfang an wissen, wie viele Artikel Sie haben werden, können Sie :

vector<vector<point> > a(10, vector<point>(10));

Es ist ein Vektor, der 10 Vektoren mit 10 Punkten enthält. Dann können Sie verwenden

a[4][4] = p;

Ich glaube jedoch, dass die Verwendung von Vektoren von Vektoren verwirrend ist. Wenn Sie ein Array wollen, sollten Sie uBLAS verwenden 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;
}

12voto

wheaties Punkte 34965

Hier ist ein weiterer Vorschlag. Was Sie zu erreichen versuchen, wurde schon einmal gemacht und findet sich in der Boost Multi-Array .

7voto

jlarcombe Punkte 689

Sie haben einen leeren Vektor von Vektoren konstruiert und versucht, das erste Element zu derefenzieren, ohne ihm Elemente hinzuzufügen.

Vektoren funktionieren nicht wie (einige) assoziative Arrays, bei denen der Versuch, auf einen fehlenden Wert zuzugreifen, ihn der Sammlung hinzufügt. Sie müssen sicherstellen, dass die Vektoren eine angemessene Anzahl von Einträgen haben, bevor Sie versuchen, auf sie zuzugreifen, indem Sie die entsprechende Form des Vektorkonstruktors verwenden oder push_back einsetzen.

3voto

Jerry Coffin Punkte 452852

Sie erstellen Ihr 2D-Array genau richtig. Das Problem ist, dass es bei der Erstellung ein leeres Array ist - es enthält noch keine Punkte. Du versuchst verwenden. den Punkt bei [0][0], bevor Sie dort tatsächlich einen Punkt erstellt haben. Um ein neues Element in einen Vektor einzufügen, verwenden Sie normalerweise resize() um die Größe des Vektors festzulegen, oder push_back() um Elemente nacheinander hinzuzufügen. In diesem Fall wird die letztere wahrscheinlich ein bisschen ungeschickt sein - da Sie einen Vektor von Vektoren von Punkt haben, müssen Sie einen Vektor von Punkt erstellen, einen Punkt auf diesen Vektor schieben und dann diesen Vektor auf Ihr Array schieben.

2voto

Sai Charan Punkte 67

Der einfachste Weg wäre die Verwendung von resize() Methode wie folgt:

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]<<" ";

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X