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

Accessing an element and its successor in a list at the same time

本文关键字:元素 一个 访问 列表      更新时间:2023-10-16

我有一个列表,当迭代它时,我想同时访问迭代器上的元素和迭代器+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)));
}

match函数对迭代器不做任何操作,它只是从迭代器中获取一些球队的值来计算匹配结果。

但是c++迭代器不起作用,因为match函数中的元素仍然是相同的。我该怎么做呢?

传递迭代器并在同一遍历中对迭代器进行操作(如迭代器的自增操作)会导致未定义的行为。在执行此类操作时,您应该了解诸如序列点之类的某些概念。

此外,您还可以查看此链接。我建议您在传递到函数后移动操作符的增量。

您可以避免在循环的增量部分增加迭代器,并在主体中点它:

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;
    ...
    ...

迭代器加两次,第一次是在for循环的开头:

std::advance(it,2)

然后在循环体中执行:

++it
这真的是你想要的吗?这看起来很让我困惑。

如果你想让它旁边的元素,但不希望增加它,最好使用:

auto nextIt = std::next(it);

Also: match函数做什么?你确定它的实现是正确的,而不是bug的来源吗?

希望有帮助

亚历山大