7

私はこのようなリストのリストを持っています:

    std::list<std::list<double> > list;

ダブルスを含むリストをいくつか入力しました(実際にはかなりの数であるため、ベクトルを使用していません。このコピーにはすべて時間がかかります)。

list[3][3]リストがリストではなく、ベクトルまたは2次元配列であるかのように、アクセスできる要素にアクセスしたいとします。どうすればいいですか?

リスト内の要素へのアクセスは、イテレータを使用して実行されることを知っています。でもダブルを抜ける方法がわからなかった。

4

3 に答える 3

4
double item = *std::next(std::begin(*std::next(std::begin(list), 3)), 3);

ただし、ベクトルを使用すると、通常、パフォーマンスが大幅に向上します。リストのアクセス要素nはO(n)です。

コンテナの内部のスプライシングのパフォーマンスが心配な場合は、を使用できますdeque。これはoperator[]、両端からの一定の挿入と削除、および内部からの線形時間の挿入と削除を償却します。

C ++ 03コンパイラの場合beginnext自分で実装できます。

template<typename Container>
typename Container::iterator begin(Container &container)
{
    return container.begin();
}
template<typename Container>
typename Container::const_iterator begin(const Container &container)
{
    return container.begin();
}
template<typename T, int n>
T *begin(T (&array)[n])
{
    return &array[0];
}

template<typename Iterator>
Iterator next(Iterator it, typename std::iterator_traits<Iterator>::difference_type n = 1)
{
    std::advance(it, n);
    return it;
}
于 2012-09-05T11:41:38.060 に答える
1

実際にあなたの質問に答えるには、おそらくを見る必要がありますstd::advance

于 2012-09-05T11:45:57.930 に答える
1

あなたの質問に厳密に答えるために、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倍になることを意味します。そして、このすべての割り当てと管理にも余分な実行時間がかかります。

于 2012-09-05T12:07:29.377 に答える