だから私はリストを持っています:
list<Object> myList;
myList.Push_back(Object myObject);
よくわかりませんが、これが配列の「0番目」の要素になると確信しています。 「myObject」を返す関数を使用できますか?
Object copy = myList.find_element(0);
?
シーケンスの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で追加されました。
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
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
}
おそらく最も効率的な方法ではありません。しかし、リストをベクトルに変換することはできます。
#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];