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
- Dodawane sa 2 nowe elementy do wektora (2x wywolywany jest konstruktor)
- Usuniecie jednego elementu (automatycznie wywolywany destruktor)
- Wejscie w mniejszy zasieg
- Zamiana jednego elementu (NIE wywolywany jest destruktor)
- Wyjscie z zasiego (teraz wywolywany jest destruktor elementu
x
)
- Koniec programu (wyczyszczenie reszty wektora)