执行v.erase(some_iterator);
实现是否足够聪明,不能进行任何重新分配/字节复制,因为我们只能更新大小? (与严格删除内部元素时不同。)
答案 0 :(得分:12)
从std::vector
中删除不会使迭代器失效,也不会在第一个擦除元素之前对元素进行引用。
因此,如果您只删除最后一个元素,则可以保证所有其他元素都保持原样,不会移动或复制它们。
但是,请注意,从std::vector
删除通常只会更改其大小,而不是其容量,因此旧对象所在的内存仍归vector
所有。这是出于性能原因而没有什么可担心的(除非你的RAM耗尽)。
此外,删除的对象当然是正确破坏的,因此如果它们不是简单的可破坏的,除了调整vector
的大小之外,还必须运行它们的析构函数。
答案 1 :(得分:0)
通过擦除不会改变矢量容量。只是指向结束的指针被改变了。使用shrink_to_fit(C ++ 11)来真正释放内存
int main (int argc, char* argv []) {
size_t tmp [5] = {0, 1, 2, 3, 4};
std::vector<size_t> vec (tmp, tmp+5);
std::cout << "vec.capacity () == " << vec.capacity () << std::endl;
std::vector<size_t>::iterator i (&vec [3]);
vec.erase (i, vec.end ());
std::cout << "vec.capacity () after erase == " << vec.capacity () << std::endl;
vec.shrink_to_fit ();
std::cout << "vec.capacity () after shrink_to_fit == " << vec.capacity () << std::endl;
}
将输出:
vec.capacity () == 5
vec.capacity () after erase == 5
vec.capacity () after shrink_to_fit == 3