标准模板库列表 - 双重链接或循环链接?

pmc*_*mcs 1 c++ iterator stl list

我刚刚注意到std::listC++中有关该类的一些内容我很好奇.简而言之,它涉及列表迭代器的工作方式.请考虑以下代码:

std::list<int> alist;
alist.push_back(0);
alist.push_back(1);
alist.push_back(2);
Run Code Online (Sandbox Code Playgroud)

显然,这会创建一个包含三个整数元素的列表.我可以定义一个到列表开头的迭代器,并使用它来打印出第一个元素中包含的值,如下所示:

std::list<int>::iterator iter = alist.begin();
std::cout << *iter << std::endl;  // Prints "0" to stdout
Run Code Online (Sandbox Code Playgroud)

我觉得有点奇怪的是,如果我现在递减迭代器,它会"循环"并最终指向列表中的最后一个元素:

--iter;
std::cout << *iter << std::endl;  // Prints "2" to stdout
Run Code Online (Sandbox Code Playgroud)

这种合理的行为是否被认为是一种双重链接列表?如果列表是循环链接列表,我非常期望迭代器中的类似行为,但我发现这很奇怪.

您过去使用过的迭代器行为是否有任何实际用途?是否有任何与此行为相关的陷阱我应该留意?

(顺便说一句,这发生在gcc 4.7.0(MinGW).我没有用任何其他版本或编译器测试它.)

Oli*_*rth 10

递减迭代器会begin调用未定义的行为.你看到的行为很可能是巧合(事实上,看看这里有不同的编译器会发生什么).

如果你想确认一下,你可以简单地看一下GCC的实现list; 你通常可以找到来源/usr/include/c++/4.x.y/bits/stl_list.h.