错误:对于列表迭代器,“不匹配运算符+”

时间:2012-05-12 13:35:16

标签: c++ list stl iterator

对于下面的代码,我收到了行

标题中的错误
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

我没有收到同样的错误

有什么问题?

4 个答案:

答案 0 :(得分:11)

iterator的{​​{1}}是双向的,因此它不支持std::list。唯一受支持的移动操作是+(int)++

答案 1 :(得分:10)

这是因为std::list的迭代器是bidirectional iterators,因此它们不支持您尝试执行的添加操作。实际上,这是因为它不能实现为有效的操作,因为列表不提供随机访问,因此您必须从初始迭代器到目标迭代器以单个增量步进。设计决策是不提供效率低下的操作。

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

答案 2 :(得分:4)

std::list迭代器只是双向的,而不是随机访问,因此您无法使用运算符+来推进它们。请改用std::next(C ++ 11)或std::advance

答案 3 :(得分:2)

这是“概念”的问题。

list只能有效遍历forward and backward,因此它的迭代器会对双向迭代器概念进行建模。

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

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