【问题标题】:Error: "no match for operator+" , for list iterator错误:“no match for operator+”,用于列表迭代器
【发布时间】:2026-01-24 20:00:02
【问题描述】:

对于下面的代码,我在行标题中收到错误

while((*(It2 + code)).exists){


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++;
    }
}

++It 没有出现同样的错误

有什么问题?

【问题讨论】:

    标签: c++ list stl iterator


    【解决方案1】:

    std::listiterator 是双向的,因此它不支持 +(int)。唯一支持的移动操作是++--

    【讨论】:

      【解决方案2】:

      那是因为std::list 的迭代器是bidirectional iterators,所以它们不支持您尝试执行的加法运算。在实践中,这是因为它不能作为一种有效的操作来实现,因为列表不提供随机访问,所以你必须从初始迭代器单步递增到目标迭代器。设计决策是不提供效率低下的操作。

      您可以使用std::advancestd::next 来避免编写自己的增量循环,但在后台它会逐步递增。

      【讨论】:

        【解决方案3】:

        std::list 迭代器只是双向的,不是随机访问的,所以你不能使用操作符+ 来推进它们。请改用std::next (C++11) 或std::advance

        【讨论】:

          【解决方案4】:

          这是一个“概念”的问题。

          list 只能有效地遍历forward and backward,因此它的迭代器模拟了双向迭代器的概念。

          您可以使用std::advance 将迭代器一次移动多个位置,但效率不高。

          或者您可以更改为使用vectordeque 而不是列表。由于它们是随机存取容器,它们的迭代器有效地支持加法和减法。

          【讨论】:

            最近更新 更多