私はいくつかのコードと配列を持っています。各反復で最初の要素を削除し、 、次に配列の内容を合計します。もちろん、配列は同じサイズのままです。私はベクトルとリストの両方を使ってみましたが、どちらもかなり遅いです。C++、最速のSTLコンテナで、{delete [begin]、insert [end]、および配列全体の内容の合計}
int length = 400;
vector <int> v_int(length, z);
list <int> l_int(length, z);
for(int q=0; q < x; q++)
{
int sum =0;
if(y) //if using vector
{
v_int.erase(v_int.begin()); //takes `length` amount of time to shift memory
v_int.push_back(z);
for(int w=0; w < v_int.size(); w++)
sum += v_int[w];
}
else //if using list
{
l_int.pop_front(); //constant time
l_int.push_back(z);
list<int>::iterator it;
for (it=l_int.begin() ; it != l_int.end(); it++) //seems to take much
sum += *it; //longer than vector does
}
}
問題は、ベクトルの最初の要素を消去すると、互いに要素がベクトルの大きさ、各反復に要する時間の分だけ、乗算、シフトダウンすることを必要とすることです。リンクされたリストを使用すると、これを避けることができ(要素の一定時間の削除)、配列の合計時間(配列の線形時間トラバース)を犠牲にするべきではありません。ベクトルは(少なくとも1桁長い)。
ここで使用するのに適した容器はありますか?または別の方法で問題に近づくことができますか?
ちょっと良いアイデアを使用することができ、一端に挿入し、他に削除する場合。 Btwは、削除/挿入または同じ速度のリストよりも速く待ち行列に入っていますか?また、好奇心のために、配列トラバーサルのためにリストが非常に遅いのは何ですか? –
単純な配列を使用すると、ポインタ演算で各要素にアクセスできます。特定のサイズの要素がある場合、インデックスの要素を見つけるために 'initial_offset + size * index'に行くことができます。リンクされたリストで、最初の要素にアクセスし、次の要素へのリンクを見つけ、次の要素にアクセスし、目的の要素に到達するまで繰り返します。 – ColGraff
@Graffええ、もし私がすでに総計のようにすべての要素を超過しなければならない場合、これは余分な時間を費やすべきではありませんか? –