Do zamiany elementow w tym kontenerze (jak juz zauzywazyles) sluzy metoda replace.
Uzycie jej jest bardzo proste:
Kopiuj
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:
Kopiuj
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:
Kopiuj
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:
Kopiuj
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)