Zamiana zawartości ptr_vector

0

Witam

Mam pytanie związane z kontenerem ptr_vector. Doczytałem, że on sam zarządza pamięcią i realizuje RAII, ale nie wiem, jak zamienić jeden z jego elementów (dany poprzez indeks) na wskaźnik do innego obiektu. Wiem, że jest funkcja replace(), ale nie rozumiem za bardzo co ona zwraca (auto_type ?). A druga sprawa - czy muszę ręcznie przy pomocy delete usuwać obiekt wskazywany przez podmieniany wskaźnik ? Z góry przepraszam za zadawanie tak banalnego zapewne pytania, ale jakoś dokumentacja boosta jest dla mnie mało czytelna.

1

Do zamiany elementow w tym kontenerze (jak juz zauzywazyles) sluzy metoda replace.
Uzycie jej jest bardzo proste:

myVec.replace(myVec.begin(), new Foo);

Zamieni nam pierwszy element wektora na podany w drugim argumencie metody.

Po wyjsciu z kontenera element jest usuwany z pamieci, wtedy kiedy nie ma dodatkowych dowiazan do niego. Kod wyzej po wywolaniu usunie element na pozycji wskazywanej przez iterator begin. Dlatego tez najprosciej jest ignorowac kompletnie zwracana wartosc. Jesli natomiast jest ona Ci do czegos potrzebna, to stosuje sie skladnie mniej-wiecej taka:

auto x = myVec.replace(myVec.begin(), new Foo);

W tym przypadku obiekt zostanie dopiero usuniety z pamieci, kiedy zmienna x wyjdzie poza zakres.

Krotki przykladzik testowy i wynik dzialania:

class Foo {
public:
	Foo() { cout << "Konstruktor FOO\n"; } 
	~Foo() { cout << "Destruktor FOO\n"; }
};

int main()
{
	boost::ptr_vector<Foo> myVec;
	myVec.push_back(new Foo);
	myVec.push_back(new Foo);
	cout << "Skonczone dodawanie\n\n";

	myVec.erase(myVec.begin());
	cout << "Skonczone usuwanie\n\n";

	int i = 3;
	if(i == 3) {
		auto x = myVec.replace(myVec.begin(), new Foo);
		cout << "Skonczona zamiana\n\n";
	}

	cout << "Koniec Programu\n\n";
	cin.get();
	return 0;
}

Out:

Konstruktor FOO
Konstruktor FOO
Skonczone dodawanie

Destruktor FOO
Skonczone usuwanie

Konstruktor FOO
Skonczona zamiana

Destruktor FOO
Koniec Programu

Destruktor FOO
  1. Dodawane sa 2 nowe elementy do wektora (2x wywolywany jest konstruktor)
  2. Usuniecie jednego elementu (automatycznie wywolywany destruktor)
  3. Wejscie w mniejszy zasieg
  4. Zamiana jednego elementu (NIE wywolywany jest destruktor)
  5. Wyjscie z zasiego (teraz wywolywany jest destruktor elementu x)
  6. Koniec programu (wyczyszczenie reszty wektora)

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