gpt4 book ai didi

c++ - 为什么STL vector的迭代器可以指向不存在的元素?

转载 作者:太空宇宙 更新时间:2023-11-03 10:46:21 27 4
gpt4 key购买 nike

我编写测试代码来确定 vector 的迭代器是否可以像这样超出 end() 迭代器。

#include <vector>
#include <iostream>
using namespace std;

int main()
{
vector<int> v;
v.push_back(100);
cout << v.capacity() << endl;
vector<int>::iterator itr = v.begin();
for (int i = 0; i < 10000; ++i, ++itr)
if (itr == v.end()) cout << "end at " << i << endl;
cout << *itr << endl;
return 0;
}

打印结果:

1
end at 1
0

vector 对象v只有1个容量,但是它的迭代器可以访问end()迭代器之后的内存。这种情况有什么保护措施吗?

最佳答案

迭代器不能防止访问不存在的元素,因为它们应该保证最小的开销。 std::vector::operator[]也是如此.访问 std::vector::end() 或之后的元素使用其中一种方法会产生未定义的行为,并且无法在事后检测到它。

然而,std::vector::at()成员函数抛出 std::out_of_range在那些情况下。可以优雅地捕获和处理此异常。由于边界检查,为迭代器实现此功能会引入运行时开销。它还会引入空间开销,因为迭代器现在不仅需要了解当前元素,还需要了解它迭代的 vector 。

关于c++ - 为什么STL vector的迭代器可以指向不存在的元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20770293/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com