Вы можете думать о своей проблеме так, как будто вам пришлось использовать итераторы над индексами в вашем векторном примере. Давайте упростим это так:
for(std::size_t i = 0; i < data.size(); ++i)
do_somthing_with(data[i]);
Вы написали бы это так итераторами:
for(std::vector<MyClass>::iterator it = data.begin(); it != data.end(); ++it)
do_somthing_with(*it);
Теперь сделать то же самое с сетами просто:
for(std::set<MyClass>::iterator it = data.begin(); it != data.end(); ++it)
do_somthing_with(*it);
Если вы хотите использовать тройной цикл, по моему мнению, проблема начинается со следующего итератора. С C ++ 11 вы могли бы использовать std :: next , но, поскольку вы не можете, вам нужно сохранить итератор и затем продвинуть его:
for(std::set<MyClass>::iterator it1 = data.begin(); it1 != data.end(); ++it1)
{
std::set<MyClass>::iterator it2 = it1;
++it2;
for(; it2 != data.end(); ++it2)
{
std::set<MyClass>::iterator it3 = it2;
++it3;
for(; it3 != data.end(); ++it3)
do_somthing_with(*it1,*it2,*it3);
}
}
Также вы можете определить свою собственную функцию next
, например ::
template<class ForwardIt>
ForwardIt next(ForwardIt it)
{
return ++it;
}
Это в основном упрощенная версия предлагаемой реализации std :: next .
Тогда код легче переписать:
for(std::set<MyClass>::iterator it1 = data.begin(); it1 != data.end(); ++it1)
for(std::set<MyClass>::iterator it2 = next(it1); it2 != data.end(); ++it2)
for(std::set<MyClass>::iterator it3 = next(it2); it3 != data.end(); ++it3)
do_somthing_with(*it1,*it2,*it3);