2011-09-12 8 views
1

vectorを使用することができない状況にあります。&element[x]を使用して、ポインタが無効になるようにアイテムを追加するためです。問題は、std::listoperator []をオーバーロードしておらず、at()メソッドを提供していないようです。したがって、私がat()をシミュレートできる唯一の方法は、イテレータを使用することです。しかし、これを行うより良い方法はありますか? (listのもののような)非ランダムアクセスイテレータの場合[]演算子はstd :: listですか?

+2

std :: dequeで十分ですか? – PeskyGnat

+0

あなたはベクトルと 'my_iterator = my_vector.insert(my_iterator、VALUE);';を使うことができます。ベクトルは、要素がシフトされるときでさえ、一般的な場合に良好な性能を提供する。 – Benoit

答えて

9

おそらくデザインを再考する必要があります。 std::listためoperator[]またはatがパフォーマンスの災害につながるエミュレートしようとすると

:これらの操作はstd::list::iteratorとしてO(N)とではないO(1)時間がかかるだろうが双方向イテレータではなく、ランダムアクセスイテレータです。したがって、コンテナを繰り返し繰り返し、各要素の[]またはatを呼び出すと、O(N)の代わりにO(N * N)になります。

これは、これらの操作がstd::listによって提供されない理由です。

+0

より正確に言うと、 'std :: list'イテレータは**双方向**です。 – Blastfurnace

+0

@Blastfurnace絶対に、それを修正しました –

4
#include <iterator> 

std::list<int> l; 
std::list<int>::iterator it = l.begin(); 
std::advance(it, 37); 

、これは当然のことながら、線形時間がかかります。

0

いいえstd :: listはリンクリストです。 1つの要素に直接アクセスすることはできません。最初から要素を反復する唯一の可能性。

関連する問題