web-dev-qa-db-ja.com

C ++ std :: vectorからすべてのアイテムを削除します

次のコードを使用して、std::vectorからすべてを削除しようとしています

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

しかし、それは機能しません。


更新:ベクターが保持している要素を消去しませんか?私はまだオブジェクトを使用しているので、それを望んでいません、ただコンテナを空にしたいだけです

59
michael

_std::vector::clear_ を使用する必要があると思います:

_vec.clear();
_

編集:

ベクターによって保持されている要素を破壊しませんか?

はい、そうです。メモリを返す前に、ベクター内のすべての要素のデストラクタを呼び出します。それは、ベクターに保存する「要素」に依存します。次の例では、ベクター自体にオブジェクトを保存しています。

_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).
_

たとえば、異なるコンテナ間でオブジェクトを共有する場合、それらへのポインタを保存できます。この場合、clearが呼び出されると、ポインターメモリのみが解放され、実際のオブジェクトは変更されません。

_std::vector<myclass*> myvector;
...
myvector.clear(); // calling clear will do:
// 1) ---------------
// 2) size == 0 (the vector contained "pointers" not the actual objects).
_

コメント内の質問について、getVector()は次のように定義されていると思います。

_std::vector<myclass> getVector();
_

たぶん、あなたはリファレンスを返したいでしょう:

_// vector.getVector().clear() clears m_vector in this case
std::vector<myclass>& getVector(); 
_
100
AraK

vector.clear()はあなたのために動作するはずです。 clearとともにvectorの容量を縮小する場合

std::vector<T>(v).swap(v);
33
aJ.

vector.clear()は、事実上vector.erase(vector.begin()、vector.end())と同じです。

あなたの問題が、ベクトルに含まれるそれぞれのpointerに対して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 );

標準免責事項:ブラウザで記述されたコード、テストなし。

10
DevSolar

v.clear() を使用して、ベクターを空にします。

ベクトルにポインターが含まれる場合、clearはオブジェクトのデストラクターを呼び出しますが、ポインターが参照するメモリは削除しません。

vector<SomeClass*> v(0);

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

v.clear();  //Memory leak where "one" instance of SomeClass is lost
9
Alex B

v.clear()は何らかの理由で機能していませんか?

4
Rob

ポインターをコンテナー内に保持し、それらを手動で破棄することに煩わされたくない場合は、 boost shared_ptr を使用します。 std :: vectorのサンプルを次に示しますが、他のSTLコンテナ(セット、マップ、キューなど)に使用できます。

#include <iostream>
#include <vector>
#include <boost/shared_ptr.hpp>

struct foo
{
    foo( const int i_x ) : d_x( i_x )
    {
        std::cout << "foo::foo " << d_x << std::endl;
    }

    ~foo()
    {
        std::cout << "foo::~foo " << d_x << std::endl;
    }

    int d_x;
};

typedef boost::shared_ptr< foo > smart_foo_t;

int main()
{
    std::vector< smart_foo_t > foos;
    for ( int i = 0; i < 10; ++i )
    {
        smart_foo_t f( new foo( i ) );
        foos.Push_back( f );
    }

    foos.clear();

    return 0;
}
3
Dominic.wig

swap().の上記の利点に加えて、clear()はメモリの割り当て解除を保証しません。次のようにswap()を使用できます。

std::vector<T>().swap(myvector);
2
Samer