2009-12-01 14 views
11

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; 

答えて

11

最も簡単な方法は、単に文字通りコードを書き換えている:

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; 
    } 
    } 
} 
+0

'auto'は現在の標準の一部ではありません。 –

+0

真実、ここで怠惰。コメントが追加されました。 – MSalters

+0

ニート!すでに1倍モードになっています! – xtofl

1

だけ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++; 
} 
関連する問題