vector
を使用することができない状況にあります。&element[x]
を使用して、ポインタが無効になるようにアイテムを追加するためです。問題は、std::list
がoperator []
をオーバーロードしておらず、at()
メソッドを提供していないようです。したがって、私がat()
をシミュレートできる唯一の方法は、イテレータを使用することです。しかし、これを行うより良い方法はありますか? (list
のもののような)非ランダムアクセスイテレータの場合[]演算子はstd :: listですか?
答えて
おそらくデザインを再考する必要があります。 std::list
ためoperator[]
またはat
がパフォーマンスの災害につながるエミュレートしようとすると
:これらの操作はstd::list::iterator
としてO(N)とではないO(1)時間がかかるだろうが双方向イテレータではなく、ランダムアクセスイテレータです。したがって、コンテナを繰り返し繰り返し、各要素の[]
またはat
を呼び出すと、O(N)の代わりにO(N * N)になります。
これは、これらの操作がstd::list
によって提供されない理由です。
より正確に言うと、 'std :: list'イテレータは**双方向**です。 – Blastfurnace
@Blastfurnace絶対に、それを修正しました –
#include <iterator>
std::list<int> l;
std::list<int>::iterator it = l.begin();
std::advance(it, 37);
、これは当然のことながら、線形時間がかかります。
いいえstd :: listはリンクリストです。 1つの要素に直接アクセスすることはできません。最初から要素を反復する唯一の可能性。
- 1. std :: listの演算子[]がないのはなぜですか?
- 2. XOR演算子とstd :: ostream演算子
- 3. <<演算子をオーバーロードしてstd :: listを出力する
- 4. std :: listのオーバーロードされたブラケット演算子
- 5. std :: iteratorの演算子
- 6. 抽出演算子 '[' - POSIXlt unclassed list prints datetime
- 7. std :: shared_ptrに[]演算子がないのはなぜですか?
- 8. C++ std :: set Find関数オーバーロード==演算子
- 9. '演算子<<' のstdで::演算子<< [_Traits =のstdと:: char_traits <char>]
- 10. ":"演算子は代入演算子 "="と同等ですか?
- 11. ||演算子は=演算子と同じですか?
- 12. は、Invoke演算子&演算子はKotlin
- 13. std ::任意の演算子*()と演算子 - >() - 未定義の動作
- 14. 演算子( - - )()演算子C#
- 15. 演算子if演算子
- 16. `のstd ::はistream&起動するには<< INT&」演算子
- 17. C++演算子()括弧 - 演算子Type()vs型演算子()
- 18. オーバーロード比較です演算子「無効な演算子は、<」
- 19. * =演算子は
- 20. 「演算子は[]」
- 21. 共有ポインタ[]演算子と++演算子
- 22. 演算子のオーバーロード演算
- 23. Java演算子 - > how ==演算子
- 24. C++演算子+演算子+ =オーバーロード
- 25. Pythonのビット演算子 '&' 演算子
- 26. Xval演算子と比較演算子?
- 27. C++:演算子オーバーロード、演算子+
- 28. Groovy *。演算子
- 29. intからstd :: stringへの変換演算子のオーバーロード
- 30. Javaの* =演算子の演算子の優先順位は何ですか?
std :: dequeで十分ですか? – PeskyGnat
あなたはベクトルと 'my_iterator = my_vector.insert(my_iterator、VALUE);';を使うことができます。ベクトルは、要素がシフトされるときでさえ、一般的な場合に良好な性能を提供する。 – Benoit