C++ 同时访问列表中的元素及其后续元素

C++ 同时访问列表中的元素及其后续元素,c++,list,iterator,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(*(*ite

我有一个列表,当迭代它时,我想在迭代器上访问元素,同时在迭代器+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)));
}
std::list teamlist=league.GetTeamMembers();
对于(std::list::iterator iterator=teamlist.begin();iterator!=teamlist.end();std::advance(iterator,2))
{
匹配(*(*迭代器),*(*(++迭代器));
}
match函数对迭代器不做任何处理,它只是从中获取团队的一些值来计算匹配结果


但是,++迭代器不起作用,因为matchfunction中的元素仍然相同。如何做到这一点?

传递迭代器并在同一过程中对迭代器进行操作(如迭代器的增量)会导致未定义的行为。在执行此类操作时,您应该了解某些概念,例如


此外,您还可以检查链接。我建议您在传递到函数之后移动运算符的增量。然后它应该可以正常工作。

传递迭代器并在同一过程中对迭代器进行操作(如迭代器的增量)会导致未定义的行为。在执行此类操作时,您应该了解某些概念,例如


此外,您还可以检查链接。我建议您在传递到函数之后移动运算符的增量。然后它应该可以正常工作。

您可以避免在循环的增量部分增加迭代器,并在正文中点上迭代器:

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;
    ...
    ...
std::list teamlist=league.GetTeamMembers();
for(std::list::iterator it=teamlist.begin();
it!=teamlist.end();/*这里什么都没有*/)
{
match(*(*it),*(*(+++it));//未确定首先计算哪个参数表达式
++它;
...
...
编辑:

正如Fredsoverflow所指出的,匹配参数表达式计算不能保证按从左到右的顺序运行。为避免这种危险情况,请执行以下操作:

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;
    ...
    ...
std::list teamlist=league.GetTeamMembers();
for(std::list::iterator it=teamlist.begin();
it!=teamlist.end();/*这里什么都没有*/)
{
团队*pa=*it;
团队*pb=*(++it);
匹配(*pa,*pb);
++它;
...
...

您可以避免在循环的增量部分增加迭代器,并将其点在正文中:

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;
    ...
    ...
std::list teamlist=league.GetTeamMembers();
for(std::list::iterator it=teamlist.begin();
it!=teamlist.end();/*这里什么都没有*/)
{
match(*(*it),*(*(+++it));//未确定首先计算哪个参数表达式
++它;
...
...
编辑:

正如Fredsoverflow所指出的,匹配参数表达式计算不能保证按从左到右的顺序运行。为避免这种危险情况,请执行以下操作:

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;
    ...
    ...
std::list teamlist=league.GetTeamMembers();
for(std::list::iterator it=teamlist.begin();
it!=teamlist.end();/*这里什么都没有*/)
{
团队*pa=*it;
团队*pb=*(++it);
匹配(*pa,*pb);
++它;
...
...

您将迭代器增加两次,首先在for循环的头部:

std::advance(it,2)
然后在循环体中,执行以下操作:

++it
这真的是你想要的吗?我觉得很困惑

如果希望元素位于其旁边,但不想增加它,最好使用:

auto nextIt = std::next(it);
另外:match函数是做什么的?你确定它的实现是正确的,而不是bug的来源吗

希望这有帮助


Alexander

您将迭代器增加两次,首先在for循环的头部:

std::advance(it,2)
然后在循环体中,执行以下操作:

++it
这真的是你想要的吗?我觉得很困惑

如果希望元素位于其旁边,但不想增加它,最好使用:

auto nextIt = std::next(it);
另外:match函数是做什么的?你确定它的实现是正确的,而不是bug的来源吗

希望这有帮助


Alexander

我编辑了我的帖子,因为我不在迭代器上操作,我只想知道下一个团队的信息。如果这就是你在迭代器上操作的意思,那么你是对的;)基本上,++迭代器将是罪魁祸首。我们无法确认表达式是从R到L还是从L到右边计算的。因此我们无法确认它*(*(++iterator))是在*(*iterator)之前/之后计算的。所以这个Bug。我编辑了我的帖子,因为我不在迭代器上操作,我只想知道下一个团队的信息。如果这就是你在迭代器上操作的意思,那么你是对的;)基本上,++iterator是罪魁祸首。我们无法确认表达式是从R到L还是从L到右边求值。因此我们无法确认*(*(++iterator))是在*(*iterator)之前/之后求值的。因此错误。
match(*it),*(*(++it)))
调用未定义的行为,因为函数参数的求值顺序未指定。@我想说明一点,即增量不需要在循环增量组中。您可以始终向变量声明,以正确的顺序填充ins,并将其用作匹配参数。因此,它是有效的,但不知怎的,它是无效的安全和cn调用未定义的行为?好的,一切都解决了,但是你能在你的帖子中用简短的形式向我解释一下这些编辑吗?@jimbo999当然,已经编辑了答案并添加了一些解释。
match(*it),*(*(++it)))
调用未定义的行为,因为函数参数的求值顺序未指定。@我想说明一点,即增量不需要在循环增量组中。您可以始终向变量声明,以正确的顺序填充ins,并将其用作匹配参数。因此,它是有效的,但不知怎的,它是无效的安全和cn调用未定义的行为?好的,一切都解决了,niceley,但你能在你的帖子中用简短的形式向我解释一下编辑的内容吗?@jimbo999当然,已经编辑了答案并添加了一些解释。我确信它是正确的;)b