###前提
std::listにおいて、指定したindexに要素にアクセスする際に適切な記述の仕方がわかりません。
cpp
1std::list lst{1,2,3,4,5,6,7,8,9}; 2// 1と表示される 3std::cout << *(lst.begin()) << std::endl; 4// でも、次のはエラー 5std::cout << *(lst.begin()+2) << std::endl;
どのように記述すればよいのでしょうか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答3件
0
std::list
コンテナはstd::vector
や配列と違って、ランダムアクセスができません。そのため、N回だけイテレータを進めて要素を参照する必要があります。
そのような用途には、std::next()
関数を使用できます。
cpp
1#include <iostream> 2#include <list> 3#include <iterator> // std::next()関数が所属するヘッダ 4 5int main() 6{ 7 std::list<int> lst{1,2,3,4,5,6,7,8,9}; 8 9 // 1と表示される 10 std::cout << *(lst.begin()) << std::endl; 11 12 // 3と表示される 13 std::cout << *std::next(lst.begin(), 2) << std::endl; 14}
この関数は、指定されたイテレータをN回進めたイテレータを返します。(指定したイテレータ自体は書き換えない)
std::next()
をサポートしていない古いコンパイラの場合は、std::advance()
関数を使用します。こちらは指定したイテレータ自体をN回進めます。
cpp
1#include <iostream> 2#include <list> 3#include <iterator> // std::advance()関数が所属するヘッダ 4 5int main() 6{ 7 std::list<int> lst{1,2,3,4,5,6,7,8,9}; 8 9 // 1と表示される 10 std::cout << *(lst.begin()) << std::endl; 11 12 // 3と表示される 13 std::list<int>::iterator it = lst.begin(); 14 std::advance(it, 2); // itを2回進める 15 std::cout << *it << std::endl; 16}
投稿2017/05/22 08:14
編集2017/05/22 15:40総合スコア132
0
ベストアンサー
iteratorを使って回数分移動するしかありません。
これを変わりにしてくれるものにstd::advance
があります。
C++
1UINT index; 2auto it = lst.begin(); 3 4// このようにする 5for (int i=0; i < index; ++i) 6{ 7 it++; 8} 9 10// 代わりに以下のようにかけます。 11std::advance(it, index);
forループにせよadvanceにせよ単純にiteratorをインクリメントするだけなので
インデックスアクセスで範囲外を参照しないようにsizeと事前に比較しておいてください。
if (lst.size() <= index) return;
見ての通りlistにおける要素の取得は高コストです。
ランダムアクセスを主目的とする場合はvector等別のコンテナを使った方がいいでしょう。
基本的には編集可能なqueueと思って使用するのがベターです。
投稿2017/05/22 05:34
総合スコア1593
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/05/22 08:20

0
こんには。
std::list lst{1,2,3,4,5,6,7,8,9};
は下記の間違いですね?
std::list<int> lst{1,2,3,4,5,6,7,8,9};
std::listのbegin()はイテレータを返却しますが、それはbidirectional_iteratorですので、+整数
演算をサポートしていません。一旦変数へ獲得し、2回++
しましょう。
C++
1auto itr = lst.begin(); 2++itr; 3++itr; 4std::cout << *itr << std::endl;
全てのコンテナが同じ機能をサポートすれば良いのにとも思いますが、STLは性能が出ない機能はサポートしない方針のようです。性能がでなくても問題ないのであればコンテナを派生して、必要な機能を追加するのが良いと思います。
もしくは、random_access_iteratorをサポートしているstd::vector<>やstd::deque<>に代えることも考えられます。
アプリケーションの要求に応じてどの性能を最大化するのかにより適切なコンテナを選択するのがSTLの思想と思います。
投稿2017/05/22 05:32
総合スコア23274
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/05/22 08:23

あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/05/22 08:17