std :: list.end()没有返回“past-the-end”迭代器
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了std :: list.end()没有返回“past-the-end”迭代器相关的知识,希望对你有一定的参考价值。
我最近开始学习C ++迭代器和指针,在搞乱一些基本练习时,我遇到了一种我认为非常不寻常的情况。
#include <iostream>
#include <vector>
#include <time.h>
#include <list>
#include <array>
using namespace std;
template<typename ITER>
void print_with_hyphens(ITER begin, ITER end){
cout << "End: " << *(end) << endl;
cout << "Begin: " << *begin << endl;
for(ITER it = begin; it != end; it++){
cout << *it << endl;
}
cout << endl << "Finished" << endl;
}
int main()
{
vector<int> v { 1, 2, 3, 4, 5};
list<int> l { 1, 2, 3, 4, 5};
print_with_hyphens(v.begin(), v.end());
print_with_hyphens(l.begin(), l.end());
// print_with_hyphens(a.begin(), a.end());
return 0;
}
当我像这样运行时,我得到了这个不寻常的结果:
现在,向量返回一个奇怪的(随机的,如果我没有弄错)值,因为它试图访问一个不存在的值,因此,“通过结束”迭代器。对于列表应该是相同的,但是,列表返回值5.它不应该返回“过去结束”迭代器吗?
答案
诸如解除引用无效迭代器或访问越界数组索引之类的事情会产生undefined behavior。
这意味着C ++标准没有规定如果你这样做会发生什么。可能会发生任何事情,例如分段错误或获取随机值,具体取决于标准库实现和编译器等。
不用说,程序不应该依赖于未定义的行为。
另一答案
在这种情况下,短语“过去的结局”是抽象的。这意味着迭代器不在容器中元素的逻辑序列的末尾。这并不意味着在内存容器之后就可以访问和读取一些文字位数据。
因为它是“过去结束”并且不引用任何实际元素,所以不允许解除引用结束迭代器。通过这样做,你会得到奇怪的行为。
以上是关于std :: list.end()没有返回“past-the-end”迭代器的主要内容,如果未能解决你的问题,请参考以下文章
纪中5日T3 1566. 幸运锁(lucky.pas/c/cpp)