考虑Select
:
std::vector
std::vector<int> vec;
vec.push_back(1);
vec.push_back(2);
和vec.clear()
会做同样的工作吗?第二种情况下的解除分配怎么样?
答案 0 :(得分:9)
vec.clear()
清除向量中的所有元素,为您保证vec.size() == 0
。
vec = std::vector<int>()
调用copy / move(自C ++ 11)赋值运算符,将vec
的内容替换为other
的内容。在这种情况下,other
是新构造的空vector<int>
,这意味着它与vec.clear();
具有相同的效果。唯一的区别是clear()
不会影响向量的容量,而重新分配时,会重置它。
旧元素正确释放,就像使用clear()
一样。
请注意,vec.clear()
始终如此快,如果没有优化程序执行此工作,最有可能比构建新向量并将其分配给vec
更快。
答案 1 :(得分:4)
他们是不同的:
clear
保证不会改变容量。
不保证移动分配可以将容量更改为零,但在典型的实现中它可能会也将会发生。
clear
保证符合此规则:
在调用
的值为止reserve()
之后发生的插入过程中不会发生重新分配,直到插入会使向量的大小大于capacity()
clear
的发布条件:
删除中的所有元素 容器。发布:
a.empty()
返回true
转让条件:
a = rv;
a应等于
rv
的值 在此之前 分配
a = il;
指定范围
[il.begin(),il.end())
成一个。全部存在 a的元素分配给或 破坏。