std::list
,std::set
,std::vector
などの標準コンテナのすべての要素のペアを反復処理する最良の方法は何ですか?標準コンテナのすべての要素の繰り返し処理(C++)
基本的にこれと同等の操作を行いますが、イテレータとするには、次の
for (int i = 0; i < A.size()-1; i++)
for(int j = i+1; j < A.size(); j++)
cout << A[i] << A[j] << endl;
std::list
,std::set
,std::vector
などの標準コンテナのすべての要素のペアを反復処理する最良の方法は何ですか?標準コンテナのすべての要素の繰り返し処理(C++)
基本的にこれと同等の操作を行いますが、イテレータとするには、次の
for (int i = 0; i < A.size()-1; i++)
for(int j = i+1; j < A.size(); j++)
cout << A[i] << A[j] << endl;
最も簡単な方法は、単に文字通りコードを書き換えている:
for (auto i = foo.begin(); i != foo.end(); ++i) {
for (auto j = i; ++j != foo.end(); /**/) {
std::cout << *i << *j << std::endl;
}
}
はC++ 98/03 const_iteratorのとauto
を交換。または、それ自身の関数に入れます:
template<typename It>
void for_each_pair(It begin, It end) {
for (It i = begin; i != end; ++i) {
for (It j = i; ++j != end; /**/) {
std::cout << *i << *j << std::endl;
}
}
}
だけconst_iteratorsを使用し、横断します。値を変更する場合は、イテレータを使用します。
例:
typedef std::vector<int> IntVec;
IntVec vec;
// ...
IntVec::const_iterator iter_cur = vec.begin();
IntVec::const_iterator iter_end = vec.end();
while (iter_cur != iter_end) {
int val = *iter_cur;
// Do stuff with val here
iter_cur++;
}
'auto'は現在の標準の一部ではありません。 –
真実、ここで怠惰。コメントが追加されました。 – MSalters
ニート!すでに1倍モードになっています! – xtofl