2013-09-30 75 views
0

這是刪除所有條目從我的載體或地圖擦除值

矢量

my_vector.erase(my_vector.begin(),my_vector.end()); 

例如,對於地圖

my_map.erase(my_map.begin(),my_map.end()); 

的地圖或一​​種安全的方式矢量結構包含的元素的解除分配在這些元素的析構中注意

es迭代器值end()返回變成無效當它開始擦除元素時?

+3

這很好,但爲什麼不叫'明確()'? – juanchopanza

+0

@ juanchopanza好奇心多數民衆贊成在所有。因爲它更乾淨清晰,所以會使用清晰 –

回答

3

這兩個erase()方法都設計用於迭代器範圍,不包括第二個範圍。

// erase elements in range [a,b) 
Iterator erase(Iterator a, Iterator b); 

因此,它是安全地調用erase()爲你做什麼,但你不妨稱之爲在這兩種情況下clear()

1

它是安全的呼籲erase(begin, end)std::vector/std::map,它也是有效的其它STL容器(list, set, deque etc),它提供erase成員函數和迭代通過元素進行迭代。

只要在有效範圍(乞求,端)通過,下面兩個範圍也是有效的,erase不採取任何努力:

c.erase(c.begin(), c.begin()); 
c.erase(c.end(), clend()); 

std::vector::erase(beg,end)移除的範圍內求的所有元素,結束)並返回下一個元素的 位置。

std::map::erase(beg,end)刪除[beg,end)範圍內的所有元素,並返回以下位置(在C++ 11之前沒有返回任何內容) 。


在STL內部實現,它在幾個函數調用erase(begin,end),如:

void clear() noexcept; 
Effects: Behaves as if the function calls: 
      erase(begin(), end()); 

void assign(size_type n, const T& t); 
Effects: 
    erase(begin(), end()); 
    insert(begin(), first, last); 

正如你所看到的,erase(begin(),end());相同clear()

或者,你可以調用swap以清除其建議在More Effective STL一個STL容器:

vector<Contestant> v; 
vector<Contestant>().swap(v); //clear v and minimize its capacity