0

編集:TLDR?要約は次のとおりです。

要件は、本質的に無限 (または任意) の長さのコンテナーです。リストは、利用可能なメモリ空間にオブジェクトが収まるため、良いアイデアのように思えます。

ただし、ベクトルはアクセスがはるかに高速で効率的ですが、長いシーケンシャル ストリップがない場合はメモリに収まらない可能性があります。

メモリ使用量を減らすためにポインターのベクトルが提案されましたが、1 ギガバイトのポインターがあり、4 GB の RAM がある場合、問題は残ります。収まらない可能性があります。

解決策: ベクトルのリストが適している場合があります。リスト内の各項目は、アクセスできるようにしたい項目への 1000 個のポインターを持つベクトルである可能性があります。クラスはこの機能を処理できます。

** 元の質問:**

賢者はかつてこう言いました。

私はクラスを持っています:

class A;

クラス A は std::list 内にあります。

std::list<A> list_of_A;

その中のアイテムにアクセスするには、次を使用しています:

std::list<A>::iterator iter = list_of_A.begin();
std::advance(iter, <an_unsigned_int>);
return *iter;

これは機能しているように見えますがreturn *iter、正しいことをしているのでしょうか? 最後の 3 行は、 を返す関数内にあることに注意してくださいconst A&

stackoverflow で回答を探しましたが、この質問の重複を見つけることができませんでした。

List > Vector は、リストの内外を交換するためです。

4

2 に答える 2

1

はい; A&関数がまたはを返す場合はリスト内の参照を返し、関数がを返すA const&場合はコピーを返しますA

ただし、これを定期的に行っている場合は、std::vector?を使用しない理由はありません。std::listそれらにはランダムアクセス反復子があり、オブジェクトが大きく、多数のオブジェクトがある場合を除き、ほとんどの場合、 よりも効率的です。std::list非常にキャッシュ効率が悪いです。

于 2013-02-27T14:58:44.200 に答える
1

end() まで進んでいない (または過去に達していない) 限り、これで問題ありません。

const A& stuff(std::list<A>& list_of_A, int index)
{
    assert(index <= list_of_A.size());              // Protect against UB
                                                    // of advancing past end.

    std::list<A>::iterator iter = list_of_A.begin();
    std::advance(iter, index);

    if (iter == list_of_A.end())
    {    throw std::runtime_error("Failed");       // Not allowed to de-reference end()
    }
    return *iter;
}
于 2013-02-27T15:24:21.803 に答える