0

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

向量

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

例如对于地图

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

映射或向量结构包含在这些元素的析构函数中进行解除分配的元素

end() 返回的迭代器值是否在开始擦除元素时变得无效?

4

2 回答 2

3

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

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

所以erase()像你一样打电话是安全的,但你最好clear()在这两种情况下都打电话。

于 2013-09-30T09:33:57.470 回答
1

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

只要传入有效范围(beg,end),以下两个范围也是有效的,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以清除以下建议的 STL 容器More Effective STL

vector<Contestant> v;
vector<Contestant>().swap(v); //clear v and minimize its capacity
于 2013-09-30T09:56:59.613 回答