Kontenery STL i ich usuwanie

0
  1. Jeżeli klasa posiada wektor(lub inny kontener) to muszę go jakoś usuwać w destruktorze, tak jak np. wskaźnik.?
  2. Czy poprawnie rozszerzam wektor? Da się to zrobić lepiej np. za pomocą funkcji std::foreach(w jaki sposób)?
	const int N = 100;
	std::vector<std::vector<int>> tab;
	tab.resize(N);
	for (int i = 0; i < N; ++i)
		tab[i].resize(N);
2
Bolae napisał(a):
  1. Jeżeli klasa posiada wektor(lub inny kontener) to muszę go jakoś usuwać w destruktorze, tak jak np. wskaźnik.?

Jeżeli mowa o takiej sytuacji:

class Foo
{
    std::vector<int> m_wektor;
};

To nie musisz ręcznie nic usuwać.

  1. Czy poprawnie rozszerzam wektor?
	const int N = 100;
	std::vector<std::vector<int>> tab;
	tab.resize(N);
	for (int i = 0; i < N; ++i)
		tab[i].resize(N);

Jeśli zamiarem jest otrzymanie wektora stu wektorów, w każdym sto intów o wartości 0, to poprawnie.

Da się to zrobić lepiej np. za pomocą funkcji std::foreach(w jaki sposób)?

Myślę że foreach zaciemni tylko kod w tym przypadku.

3

Jednolinikowcem możesz zrobić to tak:

std::vector<std::vector<int>> vec(N, std::vector<int>(N));

Przy czym może Cię zainteresować technika przedstawiona w moim poście tutaj: https://dsp.krzaq.cc/post/98/prosty-widok-na-macierz-2d-w-cpp/

0
Bolae napisał(a):
  1. Jeżeli klasa posiada wektor(lub inny kontener) to muszę go jakoś usuwać w destruktorze, tak jak np. wskaźnik.?
  2. Czy poprawnie rozszerzam wektor? Da się to zrobić lepiej np. za pomocą funkcji std::foreach(w jaki sposób)?

We współczesnym C++ jeśli poprawnie się używa RAII (Resource Acquisition Is Initialization), nie trzeba nic ręcznie usuwać.
Czyli jeśli używasz std::unique_ptr std::shared_ptr std::make_unique std::make_shared itp to nie musisz ręcznie usuwać czegokolwiek.
Tu masz fajny opis od @kq, który ci pomoże: https://dsp.krzaq.cc/post/176/ucze-sie-cxx-kiedy-uzywac-new-i-delete/
I jeszcze to: CppCon 2016: Herb Sutter “Leak-Freedom in C++... By Default.”.

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