Итерация по всем парам элементов в std-контейнерах (С++)
Какой лучший способ выполнить итерацию по всем парам элементов в контейнере std, например std::list
, std::set
, std::vector
и т.д.?
В основном, чтобы сделать эквивалент этого, но с итераторами:
for (int i = 0; i < A.size()-1; i++)
for(int j = i+1; j < A.size(); j++)
cout << A[i] << A[j] << endl;
Ответы
Ответ 1
Самый простой способ - просто переписать код буквально:
for (auto i = foo.begin(); i != foo.end(); ++i) {
for (auto j = i; ++j != foo.end(); /**/) {
std::cout << *i << *j << std::endl;
}
}
Замените auto
на const_iterator для С++ 98/03. Или поставьте его в свою собственную функцию:
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;
}
}
}
Ответ 2
Чтобы пройти, используйте 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++;
}