2013-09-30 51 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