13

この質問の手続き中にstd::vector<T>::clear、C++ 標準によって課せられた時間の複雑さの要件がないように見えることが明らかになりました。

23.2.3 の表 100 には次のように記載されています。

内のすべての要素を破棄しますa。の要素を参照するすべての参照、ポインター、およびイテレーターをa無効にし、末尾イテレーターを無効にする場合があります。投稿:a.empty()返品true

以上です。特に 23.3.6 の下にそれに関するエントリはなく、以下が に適用されることを明示的にclear示すものもありません。

[C++11: 23.3.6.1/1]:ベクターは、ランダム アクセス反復子をサポートするシーケンス コンテナーです。さらに、最後に(償却された)一定時間の挿入および消去操作をサポートします。途中での挿入と消去には線形時間がかかります。ストレージ管理は自動的に処理されますが、効率を改善するためのヒントを与えることができます。[..]

はたして…これは本当なのか?それとも私は単にそれを逃したのですか?

4

1 に答える 1

16

これは、 DR 704(および関連するDR 1301)の意図しない結果であるように思われます。これは、すべての要素を消去するときに必要ではないMoveAssignableが必要なため、とclear()同等の表現を削除しました。の観点から定義を削除すると、複雑さの要件も削除されます。それはおそらく編集的に扱うことができます。私は委員会でそれを上げました。erase(begin(), end())erase()erase()

NBstd::deque::clear()ともstd::forward_list::clear()影響を受けます。std::list::clear()複雑さが保証されています。

編集:これはhttp://cplusplus.github.com/LWG/lwg-active.html#2231になりました

于 2012-12-30T22:36:25.803 に答える