我有一个列表,当迭代它时,我想要在迭代器中访问元素,同时在迭代器+ 1处访问以下元素。这是我的尝试:
std::list<Team*> teamlist = league.GetTeamMembers();
for (std::list<Team*> ::iterator iterator = teamlist.begin(); iterator != teamlist.end(); std::advance(iterator,2))
{
match(*(*iterator), *(*(++iterator)));
}
匹配函数对迭代器没有任何作用,它只是得到团队中的一些值来计算匹配结果。
但++迭代器不起作用,因为matchfunction中的元素仍然相同。我该怎么做?
答案 0 :(得分:2)
传递迭代器并在同一遍中操作迭代器(如迭代器的增量)会导致未定义的行为。有一些概念,例如sequence points,您在执行此类操作时应注意这些概念。
此外,您还可以查看this链接。我建议你在传递给函数后移动运算符的增量。然后它应该工作正常。
答案 1 :(得分:1)
您可以避免在循环的增量部分增加迭代器并将其点在正文中:
std::list<Team*> teamlist = league.GetTeamMembers();
for (std::list<Team*> ::iterator it = teamlist.begin();
it != teamlist.end(); /*Nothing here*/)
{
match(*(*it), *(*(++it))); //Which parameter expression is evaluated first isn't determined
++it;
...
...
修改强>
正如FredOverflow指出的那样,匹配参数表达式评估不能保证以从左到右的顺序运行。为了避免这种危险情况:
std::list<Team*> teamlist = league.GetTeamMembers();
for (std::list<Team*> ::iterator it = teamlist.begin();
it != teamlist.end(); /*Nothing here*/)
{
Team *pa = *it;
Team *pb = *(++it);
match(*pa, *pb);
++it;
...
...
答案 2 :(得分:1)
你正在增加迭代器两次,首先是在for循环的头部:
std::advance(it,2)
然后在循环体中,你执行:
++it
这真的是你想要的吗?这看起来很混乱。
如果你想要它旁边的元素,但不想增加它,最好使用:
auto nextIt = std::next(it);
另外:匹配功能有什么作用?你确定它的实现是正确的而不是bug的来源吗?
希望这有帮助
亚历山大