Jak najnowocześniej i najwygodniej stworzyć macierz 2D w c++?

0

Ja wiem, że wszystko jest uzasadnione od problemu, ale powiedzmy, że sytuacja wymaga tego, iż chcemy, aby rozwiązanie było w miarę czytelne i bezpieczne.
Kiedy należałoby użyć np

Type **matrix=new Type*[] itd 

a kiedy np

vector<vector<int>> matrix; 

Czy może coś z smart pointerami? Takie pytania mnie naszły przy nauce c++11.

4

Self-insert, ale uważam to za naprawdę dobry sposób https://dsp.krzaq.cc/post/98/prosty-widok-na-macierz-2d-w-cpp/

Pomysł jest taki, że używasz tablicy 1-d i masz na nią lekki widok, który odpowiada za odpowiednie się po niej poruszanie.

template<typename T>
class simple_2d_matrix_view
{
	T* data_;
	size_t width_;
	size_t height_;
 
public:
 
	simple_2d_matrix_view(T* ptr, size_t h, size_t w):
		data_{ptr},
		width_{w},
		height_{h}
	{}
 
	size_t width() const { return width_; }
	size_t height() const { return height_; }
 
	T& operator()(size_t h, size_t w) {
		assert(w < width_);
		assert(h < height_);
		return data_[width_ * h + w];
	}
 
	T const& operator()(size_t h, size_t w) const {
		return const_cast<simple_2d_matrix_view&>(*this)(h, w);
	}
};

użycie:

vector<double> data{1,2,3,4,5,6,7,8,9,10,11,12};
 
simple_2d_matrix_view<double> m(data.data(), 2, 6);
 
for(size_t i = 0; i < m.height(); ++i) {
	for(size_t j = 0; j < m.width(); ++j) {
		cout << m(i, j) << " ";
	}
	cout << "\n";
}
0

Wszystko zależy od wymagań.
Możliwości jest kilka.
Np macierz o statycznym rozmiarze:

template <typename T, int rows, int columns>
using Matrix = std::array<std::array<T, columns>, rows>;

Wtedy podczas kompilacji można sprawdzić czy dwie macierze da się wymnożyć (czy liczba kolumn w pierwsze jest równa liczbie wierszu w drugiej macierzy).

Jeśli chcesz macierz o nieznanej wielkości, to wtedy trzeba się nieco bardziej napracować albo użyć boost::multi_array.
Jeśli jednak twoje wymagania oznaczają bardzo duże macierze z dużą liczbą zer (macierz rzadka) to wtedy nawet należy korzystać z polimorfizmu, by obsługiwać macierze o rożnej charakterystyce.

1 użytkowników online, w tym zalogowanych: 0, gości: 1