web-dev-qa-db-ja.com

位置を指定して、リスト内の特定の要素を取得する方法は?

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

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

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

Object copy = myList.find_element(0);

83
Test

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

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

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::nextはC++ 11で追加されました。

119
James McNellis

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 
30
Nawaz
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
}
6
furas

おそらく最も効率的な方法ではありません。しかし、リストをベクトルに変換することはできます。

#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];
2
Bill Moore