26 Mayıs 2021 Çarşamba

std::map.erease metodu

erase metodu - C++98
İmzası şöyle
void erase (iterator pos);           // (until C++11)
Açıklaması şöyle
The erase operations of the node-based containers (maps, sets, lists) invalidate only iterators and references to the element that was erased, but not any other iterators.
Yani sadece erase edilen eleman'a olan iterator bozulur. Bir başka thread içinde diğer elemanlara iterator varsa bunlar etkilenmez.

STL içindeki bazı veri yapıları kendisine ait erase() metoduna geçilen iterator nesnesini otomatik olarak ilerletiyor. Ancak map bu veri yapılarından değil. erase() metodu void dönüyor. Dolayısıyla döngü içinde bir şey silmek istiyorsak aşağıdakine benzer bir kod parçası kullanmamız gerekli.
for (it = tableMap.begin(); it != tableMap.end(); )
{
    if (tableId == it->first.first) { tableMap.erase(it++); }
    else                            { ++it; }
}
erase metodu - C++11
İmzası şöyle. Iterator const kabul ediliyor.
iterator erase (const_iterator pos ); // (since C++11)
Metod artık iterator dönüyor. Şöyle yaparız.
auto it = m_map.erase(beginIt, endIt);
erase metodu - C++17
İmzası şöyle. Niçin const'luktan sonra bu metod gerekti bilmiyorum.
iterator erase (iterator pos );       // (since C++17)
erase ile silme
Açıklaması şöyle. Yani silinen elemana iterator geçersiz hale gelir.
References and iterators to the erased elements are invalidated. Other references and iterators are not affected.
Örnek - reverse iterator
reverse iterator ile direkt silme doğru değil. reverse iterator önce base() metodu ile forward itertor halie getirilir ve daha sonra silinir. Şöyle yaparız
map<int,int> mymap = {{1,0},{2,1},{9,2},{10,3},{11,4}};
for(auto it = mymap.rbegin(); it != mymap.rend(); ){
    auto v = --(it.base());
    v = mymap.erase(v);
    it = map<int,int>::reverse_iterator(v);
}

Hiç yorum yok:

Yorum Gönder