std :: list.end()没有返回"过去的结束"迭代器

时间:2018-03-04 15:34:56

标签: c++ iterator

我最近开始学习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;
}

当我像这样运行时,我得到了这个不寻常的结果:

Results of the code

现在,向量返回一个奇怪的(随机的,如果我没有弄错)值,因为它试图访问一个不存在的值,因此,&#34;过了结束&#34;迭代器。 对于列表应该是相同的,但是,列表返回值5.不应该返回&#34;超过结束&#34;迭代器?

1 个答案:

答案 0 :(得分:2)

在这种情况下,“过去 - 结束”这个短语是抽象的。这意味着迭代器不在容器中元素的逻辑序列的末尾。它意味着有一些文字位数据位于内存中可以访问和读取的容器之后。

因为它是“past-the-end”并且没有引用任何实际元素,所以不允许解除引用结束迭代器。通过这样做,你会得到奇怪的行为。