6

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

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

4 回答 4

12

an iteratorfor anstd::list是双向的,所以不支持+(int). 唯一支持的移动操作是++--

于 2012-05-12T13:39:32.280 回答
10

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

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

于 2012-05-12T13:39:41.890 回答
4

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

于 2012-05-12T13:39:39.747 回答
2

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

Alist只能有效地向前和向后遍历,因此它的迭代器模拟了双向迭代器的概念。

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

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

于 2012-05-12T13:41:02.590 回答