对于下面的代码,我收到了行
标题中的错误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
有什么问题?
答案 0 :(得分:11)
iterator
的{{1}}是双向的,因此它不支持std::list
。唯一受支持的移动操作是+(int)
和++
。
答案 1 :(得分:10)
这是因为std::list
的迭代器是bidirectional iterators,因此它们不支持您尝试执行的添加操作。实际上,这是因为它不能实现为有效的操作,因为列表不提供随机访问,因此您必须从初始迭代器到目标迭代器以单个增量步进。设计决策是不提供效率低下的操作。
您可以使用std::advance
或std::next
来避免编写自己的增量循环,但是它会逐步增加。
答案 2 :(得分:4)
std::list
迭代器只是双向的,而不是随机访问,因此您无法使用运算符+
来推进它们。请改用std::next
(C ++ 11)或std::advance
。
答案 3 :(得分:2)
这是“概念”的问题。
list
只能有效遍历forward and backward,因此它的迭代器会对双向迭代器概念进行建模。
您可以使用std::advance
一次将迭代器移动几个位置,但效率不高。
或者您可以更改为使用vector
或deque
而不是列表。由于它们是随机访问容器,因此它们的迭代器可以有效地支持加法和减法。