从矢量/地图中删除值

时间:2013-09-30 09:30:16

标签: c++ vector map stl

这是从我的矢量或地图中删除所有条目的安全方法吗

矢量

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

例如,对于地图

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

map或vector结构包含在这些元素的析构函数中解除分配的元素

end()返回的迭代器值是否会变为无效,因为它开始擦除元素?

2 个答案:

答案 0 :(得分:3)

两种erase()方法都适用于迭代器范围,不包括第二种方法。

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

因此,您可以安全地拨打erase(),但在这两种情况下,您也可以致电clear()

答案 1 :(得分:1)

erase(begin, end)调用std::vector/std::map是安全的,它对于提供list, set, deque etc成员函数和迭代遍历元素的其他STL容器(erase)也有效。< / p>

只要您传入有效范围(请求,结束),以下两个范围也有效,erase不会付出任何努力:

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

std::vector::erase(beg,end)删除范围[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