列表迭代器功能不正常

List iterator disfunctionality

本文关键字:不正常 功能 迭代器 列表      更新时间:2023-10-16

我有一个小问题:我正在使用迭代器浏览列表,但我似乎无法仅使用它访问以前的位置

std::list<int>::iterator i;
for(i=mylist.begin();i!=mylist.end();i++)
{
        if(*i<0) fprintf(fout,"%d",*(i-1));//here i want to access the (i-1)th element 
}

以下是一种使用C++03:的方法

#include <iostream>
#include <list>
int main()
{
    std::list<int> mylist { 11, -22, -33, 44, -55 };
    std::list<int>::iterator i, j;
    if (!mylist.empty())
    {
        for (i = mylist.begin(); ++i != mylist.end(); )
            if (*i < 0)
                printf("%d ",*--(j=i));
        printf("n");
    }
}

使用C++11,您可以将带有j的malarky替换为std::prev(i),正如Columbo最初建议的那样。。。。

请注意,我更改了您的循环,以避免可能尝试访问*begin()之前的某个想象元素。你可以看到它在这里运行。

您可以尝试std::prev:

fprintf( fout,"%d",*std::prev(i) )

迭代器有不同的类别(请参阅迭代器的类型:输出与输入与转发与随机访问迭代器)。您的代码需要随机访问迭代器,而std::list只提供双向迭代器。

解决此问题的一种方法是将上一个值保存在变量中,并使用该值而不是*(i-1)

std::list<int>::iterator i;
int temp = mylist.begin(); //temp variable to save the past i
for(i = mylist.begin(); i != mylist.end(); i++)
{
    if(*i<0) fprintf(fout,"%d", temp);//here i want to access the (i-1)th element 
    temp = *i;
}

像这样的东西。