7

重複の可能性:
T がプリミティブ型の場合、std::vector<T>::clear() の複雑さはどのくらいですか?

std::vectorプリミティブ型の を呼び出した場合clear()(この方法push_backでは の先頭から開始しますcapacity)、clear()呼び出しは一定時間または線形時間で完了しますか? ドキュメントには、すべての要素を破棄すると書かれていますが、要素が int の場合、破棄するものは何もないはずですよね?


編集:実装がデストラクタが自明であるかどうかをチェックできることを詳細に説明し、そのチェック(GCC)を持つ1つのコンパイラの例を示すポスターを持つ複製を見つけました。

T がプリミティブ型の場合、std::vector<T>::clear() の複雑さはどのくらいですか?

4

2 に答える 2

5

ベクトルの実装方法によって異なりますが、単純なデストラクタ ( などの組み込みの整数型のような POD を含む) を持つオブジェクトの配列は、要素をループして個別に呼び出すことなくint、 を 1 回呼び出すだけで安全に割り当てを解除できる必要があります。vector<T>::allocator_type::deallocateデストラクタ。の実装は、またはコンパイラの内部をstd::vector使用して、自明なデストラクタがあるかどうかを判断し、それに応じて内部配列の割り当てを解除できます。実装のソース コードをチェックして、それが何を行うかを確認する必要がありますが、ほとんどの主流の実装では、単純なデストラクタを使用した型の一定時間の解放 (または、整数型やその他の POD の場合は少なくとも一定時間) が提供されます。type_traitsTstd::vector

于 2012-12-30T20:23:29.520 に答える
2

標準では の複雑さについては保証されていませんが、複雑std::vector::clearな要素タイプの場合は操作がコンテナのサイズに比例し、POD の場合は一定であると予想されます。

于 2012-12-30T20:24:05.700 に答える