Вопрос по list, stl, c++ – Ошибка: «нет совпадения для оператора +», для итератора списка

6

Для кода ниже, я получаю ошибку в заголовке строки

<code>while((*(It2 + code)).exists){
</code>


<code>void locatetohashtable(std::list<Element> elist,
                       int *m,std::list<Element>& table,
                       std::list<std::string>& keylist )
{        
    std::list<Element>::iterator It2=table.begin();
    int i=0;
    int k=0;
    std::list<Element>::iterator It;
    for(It = elist.begin(); It != elist.end(); ++It)
    {
        int code=hash_func(stringIntValue((*It).name),*m,i);
        while((*(It2 + code)).exists){
            i++;
        }
        table.insert(*(It2+i), (*It));
        keylist.insert(keylist.begin(),(*It).name);
        k++;
    }
}
</code>

Я не получаю ту же ошибку для++It

В чем проблема?

Ваш Ответ

4   ответа
11

iterator дляstd::list является двунаправленным, поэтому не поддерживает+(int). Единственные поддерживаемые операции перемещения -++ а также--.

10

std::list итераторы двунаправленные итераторы, поэтому они не поддерживают операцию сложения, которую вы пытаетесь выполнить. На практике это происходит потому, что его нельзя реализовать как эффективную операцию, поскольку списки не обеспечивают произвольный доступ, поэтому вам придется шаг за шагом переходить от начального итератора к целевому. Проектное решение состоит в том, чтобы не предоставлять операцию, которая будет неэффективной.

Вы можете использоватьstd::advance илиstd::next чтобы не записывать свои собственные инкрементные циклы, но под капотом он будет постепенно увеличиваться.

4

std::list итераторы только двунаправленные, а не произвольный доступ, поэтому вы не можете использовать оператор+ чтобы продвинуть их. Используйтеstd::next (C ++ 11) илиstd::advance вместо.

2

A list может быть пройден только эффективно вперед и назад, таким образом, его итераторы моделируют концепцию двунаправленного итератора.

Вы можете использоватьstd::advance для перемещения итератора на несколько позиций одновременно, однако это не будет эффективно.

Или вы можете изменить, чтобы использоватьvector илиdeque вместо списка. Поскольку они являются контейнерами произвольного доступа, их итераторы эффективно поддерживают сложение и вычитание.

Похожие вопросы