12

Is `std::vector<primitive>::clear()` a constant time operation?からの議論によると 、C++ 標準は の実行時間を指定していないようであることが指摘されましたvector::clear

これは、順序付けられた (表 102) および順序付けられていない連想コンテナー (表 103) (両方とも線形) の両方について、 list::clear(線形; §23.3.5.4.5)の実行時間を指定します。.clearただし、vector::clear欠落しているように見えます (ただし、他のvectorメンバーは、特定の複雑さを持っているよう.dataに見えます)。.swap

それは本当に特定されていないのでしょうか、それとも何かを見逃したのでしょうか?

4

1 に答える 1

7

それは本当に不特定ですか、それとも私は何かを逃しましたか?

はい。現時点では、それは本当に特定されていません。

これにはオープンライブラリの問題あり、そのテキストにはStackOverflowの関連するQ&Aへのリンクが含まれています。その質問に対するジョナサン・ウェイクリーの答えは、何が起こっているのかを明らかにしています。

リンクされた提案によると、の複雑さの要件は、すべてのシーケンスコンテナに対して線形clear()にする必要があります。ただし、複雑さの要件は単なる上限であることに注意する必要があります。C ++11規格の17.5.1.4/7項によると:

ライブラリ句で指定された複雑さの要件は上限であり、より優れた複雑さの保証を提供する実装は要件を満たします。

これにより、可能な最適化が可能になりますが、それらは必須ではありません。

リンクされた提案が受け入れられる場合でも、これが自然で一般的な最適化戦略(およびdasblinkenlightclear()による回答)であるように見えても、非クラス要素のシーケンスコンテナに対してO(1)の複雑さがあると想定することはできません。 SOのこの質問にそれを確認します)。

実装はこの戦略を採用することが許可されますが(17.5.1.4/7に従って)、標準のどこにもそのような制約が指定されていない(または指定されていない)ため、採用する必要はありません。

于 2013-02-20T02:12:03.827 に答える