Można używać jednego std :: vector zawiera całą tablicę dwuwymiarową i owinąć go w klasie, aby ukryć szczegóły. Oto przykład, używa funkcji składowej data(row, col)
, która zwraca odniesienie do elementu pod row
i col
. Włączyłem przykładową dwuwymiarową macierz z int
, gdzie każdy wpis w tablicy jest inicjowany na produkt jego row
i col
. Gdy instancja tej klasy wykracza poza zakres, domyślny destruktor zostanie wywołany i zwolni pamięć, dzięki czemu nie musisz pamiętać, aby wywołać delete [] w celu zwolnienia pamięci. Wszystkie elementy macierzy będą przylegać do pamięci, jest to pamięć podręczna przyjazna i powinna zapewnić dobrą wydajność.
#include <iostream>
#include <vector>
#include <stdexcept>
template <typename T>
class matrix {
std::vector<T> data_;
public:
size_t const rows_;
size_t const cols_;
matrix(size_t rows, size_t cols)
: rows_(rows)
, cols_(cols)
, data_(rows * cols)
{}
T& data(size_t row, size_t col) {
if (row > rows_ || col > cols_) throw std::out_of_range("matrix");
return data_[ row * cols_ + col ];
}
};
int main(int argc, char** argv)
{
matrix<int> array(100,100);
for(size_t r=0; r < array.rows_; ++r) {
for(size_t c=0; c < array.cols_; ++c) {
array.data(r,c) = r * c;
}
}
std::cout << "8 x 7 = " << array.data(8,7) << std::endl;
return 0; // array goes out of scope here, memory released automatically
}
Po uruchomieniu tego dostaniesz
8 x 7 = 56
Jeśli chcesz tablicę o rozmiarze znany tylko w czasie wykonywania, co prawdopodobnie jest naprawdę chcesz 'std :: vector'. – cHao
Czy dowiedziałeś się o standardowej bibliotece? Czy wiesz, co to jest 'std :: vector'? – amdn
@PuraVida Znam doskonale standardową bibliotekę dzięki. Testuję wydajność przy użyciu wektora> i tablicy int [] [], więc potrzebuję użyć tablicy i dlatego nie chcę używać pętli do jej zainicjowania. –