如何删除矢量中的元素。(擦除不起作用)
How to delete elements in a vector. (erase won't work )
当我用"擦除"删除向量中的元素时,没有内存被清除。例如,我制作了一个大小为2000的向量。创建程序后,将使用1.5 MB内存。当我进行擦除调用时,不会清除任何内容。所有元素都消失了。但它们仍在记忆中。
例如:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
//Makes a vector of 2000 items
vector<int> test(200000);
//Pause for test purpose
system("pause");
//erase all elements
test.erase(test.begin(),test.end());
//Pause for test purpose
system("pause");
return false;
}
Size返回0。但该过程仍然使用1.5MB的内存。
进程保留内存的原因有两个:
std::vector
只会在内存增长时重新分配内存,而不会在内存收缩时重新分配- 释放的内存通常由进程保留以供重用
在C++11中,向量有一个shrink_to_fit
成员函数,如果可能的话,它会要求向量减少分配的内存量。但不能保证它会做到这一点。在C++03中,或者如果你想保证多余的内存被释放,你可以使用将向量与新分配的向量交换的技巧:
std::vector<int>(test).swap(test);
或者如果你想完全清除它:
std::vector<int>().swap(test);
这个技巧将已分配内存的所有权转移到一个临时向量;在表达式的末尾,该向量被销毁,从而释放内存。
内存是否从进程中释放完全取决于您的库如何管理免费存储。通常,小的分配(可能高达几兆字节)是由堆处理的——该进程从系统中请求大块内存,并将它们分割成小块。除非所有的小部分都被释放,否则这些块就不能被释放,而且许多实现即使在那时也不会释放它们。
可以直接从系统请求更大的分配,在这种情况下,一旦释放,就会释放这些分配。
所以你可能会得到你期望的效果,代码如下:
// A few gigabytes will probably be allocated directly.
// You'll have to reduce this on a 32-bit system, or if there's not enough memory
std::vector<int> test(1000000000)
// Use the "swap trick" to ensure the memory is deallocated.
std::vector<int>().swap(test);
但是,即使这样也不能保证会从这个过程中释放内存;内存分配的细节不是由标准指定的,而是由编译器/库实现决定的。
erase
不会释放内存。在所讨论的代码之后,test.capacity() >= 200000
是标准所要求的。使用
test.shrink_to_fit(); // in C++11
vector<int>(test).swap(test); // in C++03
以降低矢量的容量。请注意,这仍然不能保证系统其他部分看到的内存使用量会下降。进程的堆通常不能缩小大小。
您可能喜欢这样测试它:
int main()
{
//Makes a vector of 2000 items
{
vector<int> test(200000);
//Pause for test purpose
system("pause");
//erase all elements
test.erase(test.begin(),test.end());
// Call erase or not, but destructor will be called here - freeing all memory
}
//Pause for test purpose
system("pause");
return false;
}
vector.erase
不会为了简单的目的而释放内存——可能是它已经分配的内存的可重用性,而不是为未来的请求重新分配。
当进程终止时,在您的情况下会回收内存。因此,没有必要擦除矢量
如果您想在循环中继续使用向量,那么可以考虑使用clear()
来清除向量的内容
如果向量用于对象,那么一旦对象被破坏,那么向量也会被破坏
但是,如果向量包含指针,则必须显式删除它们。
- 擦除while循环中迭代的元素
- 擦除许多矢量元素,同时使用'auto'
- 擦除是否删除 stl 无序列图元素使用的堆内存
- 调用 erase() 函数是否也会在擦除元素之前更改迭代器值?
- 为什么在功能内擦除元素后不列出更新?
- 在任一方向上迭代容器并擦除元素
- 擦除矢量中的所有元素,直到第一个非零元素C++
- 迭代时擦除设置元素///
- 从向量和对向量中擦除元素的差异
- 如何安全地擦除 std::vector 中的元素
- 如何将某个元素从shared_ptr擦除到对象向量?
- 如何擦除矢量元素中没有特定字符的元素
- 矢量擦除范围内的元素
- 给定一个向量,擦除低于 itemsnum 的元素
- 从地图上擦除元素,然后将其放回原处
- 使用 str.erase() 的索引擦除字符串的元素?
- C 矢量元素擦除与新向量创建
- 迭代一组和擦除元素
- 使用常量键从集合中擦除元素
- 从向量中擦除元素是否也会擦除元素中存在的所有成员向量