Почему добавление числа в итератор ассоциативного контейнера невозможно? - PullRequest
3 голосов
/ 26 ноября 2010

У меня есть std :: set, и я хотел перебрать пары элементов в наборе, поэтому я написал 2 для циклов следующим образом:

for(std::set<T>::iterator i=mySet.begin();i!=mySet.end();++i)
{
    for(std::set<T>::iterator j=i+1;j!=mySet.end();++j)
    {
        // do something
    }
}

Компилятор сказал мне, что я не могу добавитьчисла для итератора.Однако я могу увеличивать и уменьшать их.Обходной путь, который я нахожу, что я могу пропустить первую итерацию:

for(std::set<T>::iterator i=mySet.begin();i!=mySet.end();++i)
{
    std::set<T>::iterator j=i;
    for(++j;j!=mySet.end();++j)
    {
        // do something
    }
}

Почему я не могу просто добавить число, почему я должен увеличивать?

Ответы [ 5 ]

5 голосов
/ 26 ноября 2010

Вы можете сделать это только с помощью итератора произвольного доступа, поэтому причины те же, что и при отсутствии индексного оператора в контейнерах, когда это будет медленно.Смотрите также Почему нет оператора [] для std :: list?

2 голосов
/ 26 ноября 2010

Как обычно, у Boost есть решение:

for(std::set<T>::iterator i=mySet.begin();i!=mySet.end();++i)
{
    for(std::set<T>::iterator j=boost::next(i);j!=mySet.end();++j)
    {
        // do something
    }
}

Конечно, вы также можете рассмотреть

for(std::set<T>::iterator i=mySet.begin();i!=mySet.end();/* NOTHING */)
{
    std::for_each(++i, mySet.end(), /* do something*/ );
}
0 голосов
/ 26 ноября 2010

На ваш вопрос уже дан ответ, но учтите, что вы можете сократить свой код следующим образом:

for(std::set<T>::iterator i=mySet.begin();i!=mySet.end();++i)
{
    for(std::set<T>::iterator j=i;++j!=mySet.end();)
    {
        // do something
    }
}
0 голосов
/ 26 ноября 2010

Посмотрите здесь на определение итераторов.Метод, который вы ищете, определен только для итераторов контейнеров, который допускает произвольный доступ, набор которого не поддерживает.

0 голосов
/ 26 ноября 2010

Поскольку set поддерживает только двунаправленный итератор, он допускает только приращения и убывания.

Set обычно представляет собой древовидную структуру, поэтому это единственные операции, которые имеют смысл.

...