从c ++ std :: vector中删除所有项目

mic*_*ael 60 c++ stl vector

我试图std::vector通过使用以下代码删除所有内容

vector.erase( vector.begin(), vector.end() );
Run Code Online (Sandbox Code Playgroud)

但它不起作用.


更新:不清除破坏向量所持有的元素吗?我不想那样,因为我还在使用这些对象,我只是想清空容器

Ara*_*raK 103

我认为你应该使用std::vector::clear:

vec.clear();
Run Code Online (Sandbox Code Playgroud)

编辑:

不清除破坏向量所持有的元素吗?

是的,它确实.它在返回内存之前调用向量中每个元素的析构函数.这取决于您在矢量中存储的"元素".在下面的示例中,我将它们自己存储在向量中:

class myclass
{
public:
    ~myclass()
    {

    }
...
};

std::vector<myclass> myvector;
...
myvector.clear(); // calling clear will do the following:
// 1) invoke the deconstrutor for every myclass
// 2) size == 0 (the vector contained the actual objects).
Run Code Online (Sandbox Code Playgroud)

例如,如果要在不同容器之间共享对象,则可以存储指向它们的指针.在这种情况下,当clear调用时,只释放指针内存,不触及实际对象:

std::vector<myclass*> myvector;
...
myvector.clear(); // calling clear will do:
// 1) ---------------
// 2) size == 0 (the vector contained "pointers" not the actual objects).
Run Code Online (Sandbox Code Playgroud)

对于评论中的问题,我认为getVector()定义如下:

std::vector<myclass> getVector();
Run Code Online (Sandbox Code Playgroud)

也许你想要返回一个参考:

// vector.getVector().clear() clears m_vector in this case
std::vector<myclass>& getVector(); 
Run Code Online (Sandbox Code Playgroud)

  • 如果你的向量包含指针,这不会释放内存,只是清除集合.你必须自己释放记忆. (10认同)
  • @Michael也许getVector()返回m_vector的**副本**而不是引用. (4认同)

aJ.*_*aJ. 33

vector.clear()应该适合你.如果你想缩小的能力,vector那么就明确了

std::vector<T>(v).swap(v);
Run Code Online (Sandbox Code Playgroud)

  • Herb Sutter的"本周大师"文章之一也讨论了这种技术:http://www.gotw.ca/gotw/054.htm (4认同)
  • 交换它自己?..通常不会用新的空载体交换它吗? (3认同)

Dev*_*lar 10

vector.clear()实际上与vector.erase(vector.begin(),vector.end())相同.

如果您的问题是关于调用向量中包含的delete每个指针,请尝试以下方法:

#include <algorithm>

template< typename T >
struct delete_pointer_element
{
    void operator()( T element ) const
    {
        delete element;
    }
};

// ...
std::for_each( vector.begin(), vector.end(), delete_pointer_element );
Run Code Online (Sandbox Code Playgroud)

标准免责声明:用浏览器编写的代码,未经测试.


Ale*_*x B 9

使用v.clear()清空向量.

如果向量包含指针,则clear调用对象的析构函数,但不删除指针引用的内存.

vector<SomeClass*> v(0);

v.push_back( new SomeClass("one") );

v.clear();  //Memory leak where "one" instance of SomeClass is lost
Run Code Online (Sandbox Code Playgroud)