In C++ verwenden Sie std::vector, um Arrays zu modellieren, es sei denn, Sie haben einen spezifischen Grund für die Verwendung eines Arrays.
Beispiel für eine mit Nullen gefüllte 3x2-Vektormatrix namens "myArray", die initialisiert wird:
vector< vector > myArray(3, vector(2,0));
Das Weiterreichen dieses Konstrukts ist trivial, und Sie müssen nicht mit der Weitergabe der Länge herumspielen (weil sie verfolgt wird):
void myFunction(vector< vector > &myArray) {
for (size_t x = 0;x < myArray.size();++x){
for (size_t y = 0;y < myArray[x].size();++y){
cout << myArray[x][y] << " ";
}
cout << endl;
}
}
Alternativ können Sie über Iteratoren iterieren:
void myFunction(vector< vector > &myArray) {
for (vector< vector >::iterator x = myArray.begin();x != myArray.end();++x){
for (vector::iterator y = x->begin();y != x->end();++y){
cout << *y << " ";
}
cout << endl;
}
}
In C++0x können Sie das auto-Schlüsselwort verwenden, um die Lösung mit dem Vektoriterator zu bereinigen:
void myFunction(vector< vector > &myArray) {
for (auto x = myArray.begin();x != myArray.end();++x){
for (auto y = x->begin();y != x->end();++y){
cout << *y << " ";
}
cout << endl;
}
}
Und in c++0x wird for_each mit Lambdas möglich
void myFunction(vector< vector > &myArray) {
for_each(myArray.begin(), myArray.end(), [](const vector &x){
for_each(x->begin(), x->end(), [](int value){
cout << value << " ";
});
cout << endl;
});
}
Oder eine range-basierte for-Schleife in c++0x:
void myFunction(vector< vector > &myArray) {
for (auto x : myArray){
for (auto y : *x){
cout << *y << " ";
}
cout << endl;
}
}
*Ich bin gerade nicht in der Nähe eines Compilers und habe diese nicht getestet, bitte zögern Sie nicht, meine Beispiele zu korrigieren.
Wenn Sie die Größe des Arrays zur Kompilierzeit kennen, können Sie Folgendes tun (vorausgesetzt, die Größe ist [x][10]):
MyFunction(int myArray[][10])
Wenn Sie ein Array variabler Länge übergeben müssen (dynamisch allokiert oder möglicherweise nur eine Funktion, die verschiedene Größen von Arrays benötigt), müssen Sie sich mit Zeigern befassen.
Und wie die Kommentare zu dieser Antwort besagen:
boost::multiarray könnten angemessen sein, da es ein mehrdimensionales Array effizienter modelliert. Ein Vektor von Vektoren kann Leistungsprobleme im kritischen Pfadcode haben, aber in typischen Fällen werden Sie wahrscheinlich kein Problem bemerken.