Как итеративно печатать элементы в SET (STL)

Это код, который у меня есть. Верно.

set<float> set1;
set1.insert(1);
set1.insert(2);
set1.insert(3);

set<float>::iterator it1;
for (it1 = set1.begin(); it1 != set1.end(); it1 ++)
{
 cout << *it1 <<" ";
}
</float></float>

Но почему не работает следующий код?

set<float> set1;
 set1.insert(1);
 set1.insert(2);
 set1.insert(3);

 set<float>::iterator it1;
 for (it1 = set1.begin(); it1 != set1.end()-1; it1 ++)
 {
 cout << *it1 <<" ";
 }
</float></float>
3 ответа

Итераторы std::set являются двунаправленными. Это означает, что они поддерживают отдельные шаги в любом направлении (it++, it-- т.д.), Но не поддерживают приращения произвольной длины (it + N т.д.).

Это, скорее всего, потому, что это будет неэффективная операция O (N), поскольку std::set обычно реализуется как самобалансирующееся двоичное дерево поиска.

Вы можете увеличить/уменьшить двунаправленный итератор произвольной суммой, используя std::advance, std::next или std::prev:

std::advance(it, 42);
it = std::next(it, 42);
it = std::prev(it, 42);


Тип итератора, возвращаемый set<>::begin() не имеет operator+(int). Однако в вашем примере вы можете использовать operator--() вместо:

for (it1 = set1.begin(); it1 != --set1.end(); ++it1)
{
 cout << *it1 << " ";
}


operator- и operator+ не поддерживаются для заданных итераторов, которые не имеют тип произвольного доступа, но являются двунаправленными.

Ссылка: здесь

licensed under cc by-sa 3.0 with attribution.