这是从我的矢量或地图中删除所有条目的安全方法吗
矢量
my_vector.erase(my_vector.begin(),my_vector.end());
例如,对于地图
my_map.erase(my_map.begin(),my_map.end());
map或vector结构包含在这些元素的析构函数中解除分配的元素
end()返回的迭代器值是否会变为无效,因为它开始擦除元素?
答案 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