std :: list.end()没有返回“past-the-end”迭代器

问题描述 投票:0回答:2

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

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

c++ iterator
2个回答
2
投票

诸如解除引用无效迭代器或访问越界数组索引之类的事情会产生undefined behavior

这意味着C ++标准没有规定如果你这样做会发生什么。可能会发生任何事情,例如分段错误或获取随机值,具体取决于标准库实现和编译器等。

不用说,程序不应该依赖于未定义的行为。


2
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.