18 Eylül 2017 Pazartesi

STL Veri Yapısı - Vector Eleman Silme Metodları

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.
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 der
every 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.
0 1 2 3 4 5 6
eğer 3. elemanı silersek vector şöyle olur
0 1 2 6 4 5
Kod şöyle yazılabilir.
vec [i] = std::move(vec.back());
vec.pop_back();
pop_back metodu
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.
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