あなたの質問に厳密に答えるために、JoachimPileborgの答えは行く方法です:
std::list<std::list<double> >::iterator it = list.begin();
std::advance(it, 3);
std::list<double>::iterator it2 = (*it).begin();
std::advance(it2, 3);
double d = *it2;
さて、あなたの質問とさらなるコメントから、あなたが常にリストの最後に要素を追加するのか、それともどこにでも追加できるのかは明らかではありません。常に最後に追加すると、vector<double>
うまく機能します。Avector<T>
は、サイズが大きくなるたびにコピーする必要はありません。その容量が増加するときだけ、それは非常に異なることです。
これに加えて、reserve()
他の人が前に言ったように、を使用すると、再割り当てに大いに役立ちます。すべてのベクトルの合計サイズを予約する必要はありませんが、個々のベクトルごとにのみ予約する必要があります。それで:
std::vector<std::vector<double> > v;
v.reserve(512); // If you are inserting 400 vectors, with a little extra just in case
そして、あなたはまた、それぞれvector<double>
の内部のために予約するでしょうv
。それで全部です。
リストのリストははるかに多くのスペースを占めることを考慮に入れてください。内部リスト内のそれぞれについてdouble
、少なくとも2つの追加のポインターを割り当てる必要があります。また、グローバル最小内の各リストに2つの追加のポインターを割り当てる必要があります。これは、コンテナが使用する合計メモリがベクトルの約3倍になることを意味します。そして、このすべての割り当てと管理にも余分な実行時間がかかります。