位置を指定して、リスト内の特定の要素を取得するにはどうすればよいですか?


92

だから私はリストを持っています:

list<Object> myList;
myList.push_back(Object myObject);

よくわかりませんが、これが配列の「0番目」の要素になると確信しています。「myObject」を返す関数を使用できますか?

Object copy = myList.find_element(0);


8
配列はありません-リストです。整数でインデックスを作成する場合は、vector代わりに使用しないでください。
ポールJ.ルーカス

2
常に要素0が必要な場合は、を使用しますfront()
ポールJ.ルーカス

私はこれをテストしていませんが、私はmyList.front()+ numはここに働くだろうと仮定します
セルゲイ・フェドロフ

2
@SergueiFedorov:いいえ、ありません
アルゴマン、2015年

回答:


129

シーケンスのN番目の要素に頻繁にアクセスする必要がある場合std::list、二重にリンクされたリストとして実装されているは、おそらく正しい選択ではありません。 std::vectorまたはstd::dequeおそらく良いでしょう。

つまり、次を使用してN番目の要素へのイテレータを取得できますstd::advance

std::list<Object> l;
// add elements to list 'l'...

unsigned N = /* index of the element you want to retrieve */;
if (l.size() > N)
{
    std::list<Object>::iterator it = l.begin();
    std::advance(it, N);
    // 'it' points to the element at index 'N'
}

のようstd::listにランダムアクセスを提供しないコンテナの場合、イテレータ時間をstd::advance呼び出しoperator++ますN。または、標準ライブラリの実装で提供されている場合は、次を呼び出すことができますstd::next

if (l.size() > N)
{
    std::list<Object>::iterator it = std::next(l.begin(), N);
}

std::nextはへの呼び出しを効果的にラップします。これにより、より少ないコード行と可変変数でstd::advanceイテレータN時間を進めることが容易になります。 std::nextC ++ 11で追加されました。


18
ランダムアクセスがないため、リンクリストを検索するとパフォーマンスが低下しますが、ベクターまたはデックの途中でデータを挿入または削除する必要がある場合は、パフォーマンスが大幅に低下します。質問には、目的に理想的なコンテナを使用しているかどうかを判断するのに十分な情報が実際には含まれていません。
tloach

1
std::advanceまたはを使用する場合std::next、UBを呼び出すのは簡単です。境界チェックはありません。
okovko

33

std::listインデックスを指定して要素を取得する関数は提供していません。頻繁に行う必要がある場合は効率が悪いため、推奨されないコードを記述して取得することもできます。

必要なものは次のとおりstd::vectorです。次のように使用します。

std::vector<Object> objects;
objects.push_back(myObject);

Object const & x = objects[0];    //index isn't checked
Object const & y = objects.at(0); //index is checked 

7
std::list<Object> l; 
std::list<Object>::iterator ptr;
int i;

for( i = 0 , ptr = l.begin() ; i < N && ptr != l.end() ; i++ , ptr++ );

if( ptr == l.end() ) {
    // list too short  
} else {
    // 'ptr' points to N-th element of list
}

3

多分最も効率的な方法ではありません。しかし、リストをベクトルに変換できます。

#include <list>
#include <vector>

list<Object> myList;

vector<Object> myVector(myList.begin(), myList.end());

次に、[x]演算子を使用してベクトルにアクセスします。

auto x = MyVector[0];

あなたはそれをヘルパー関数に入れることができます:

#include <memory>
#include <vector>
#include <list>

template<class T>
shared_ptr<vector<T>> 
ListToVector(list<T> List) {
shared_ptr<vector<T>> Vector {
        new vector<string>(List.begin(), List.end()) }
return Vector;
}

次に、次のようなヘルパー関数を使用します。

auto MyVector = ListToVector(Object);
auto x = MyVector[0];
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.