erase metodu
erase() metodu silinen elemendan bir sonraki elemanı gösteren bir iterator döner. Erase edilen nesnelerin destructor metodları çağırılır. Metodun imzası şöyledir.
Erase Remove Idiom yazısına taşıdım.
2. O(1)'de silmek
iterator erase (const_iterator position);
iterator erase (const_iterator first, const_iterator last);
Girdi olarak iterator beklediği için şu kod derlenmez.vector<int> v{1, 2, 3};
v.erase(&v[0]);
Iterator invalidation rule şöyle derevery iterator and reference after the point of erase is invalidated
Complexity: The destructor of T is called the number of times equal to the number of the elements erased, but the move assignment operator of T is called the number of times equal to the number of elements in the vector after the erased elements.1. O(n)'de silmek - Erase Remove Idiom
Erase Remove Idiom yazısına taşıdım.
2. O(1)'de silmek
Eğer elemenların sırası önemli değilse, erase metodu yerine O(1)'de çalışan sondaki elemanı silinen elemanın yerine taşıyan şu yöntem kullanılabilir.
Sondaki elemanı siler. Elemanın primitive tip değilse destructor'ı çağrılır. Eğer elema primitive tipse belki vector'ün bellek alanında yaşamaya devam eder ancak vector boyunu küçülttüğü için at() metodu ile erişmek istersek exception alırız. Metod şöyledir.
0 1 2 3 4 5 6eğer 3. elemanı silersek vector şöyle olur
0 1 2 6 4 5Kod şöyle yazılabilir.
vec [i] = std::move(vec.back());
vec.pop_back();
pop_back metoduSondaki elemanı siler. Elemanın primitive tip değilse destructor'ı çağrılır. Eğer elema primitive tipse belki vector'ün bellek alanında yaşamaya devam eder ancak vector boyunu küçülttüğü için at() metodu ile erişmek istersek exception alırız. Metod şöyledir.
void pop_back()
{
--this->_M_impl._M_finish;
this->_M_impl.destroy(this->_M_impl._M_finish);
}
Genelde şöyle yaparız.auto val = vec.back();
vec.pop_back();
pop_back void döndüğü için şu kod derlenmez.auto val = vec.pop_back();
Hiç yorum yok:
Yorum Gönder