我最近开始学习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;
}
当我像这样运行时,我得到了这个不寻常的结果:
现在,向量返回一个奇怪的(随机的,如果我没有弄错)值,因为它试图访问一个不存在的值,因此,&#34;过了结束&#34;迭代器。 对于列表应该是相同的,但是,列表返回值5.不应该返回&#34;超过结束&#34;迭代器?
答案 0 :(得分:2)
在这种情况下,“过去 - 结束”这个短语是抽象的。这意味着迭代器不在容器中元素的逻辑序列的末尾。它不意味着有一些文字位数据位于内存中可以访问和读取的容器之后。
因为它是“past-the-end”并且没有引用任何实际元素,所以不允许解除引用结束迭代器。通过这样做,你会得到奇怪的行为。