同时访问列表中的元素及其后继者

时间:2014-03-17 11:48:42

标签: c++ list iterator

我有一个列表,当迭代它时,我想要在迭代器中访问元素,同时在迭代器+ 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中的元素仍然相同。我该怎么做?

3 个答案:

答案 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的来源吗?

希望这有帮助

亚历山大