我编写测试代码来找出vector的itrerator是否可以超出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;
}
Run Code Online (Sandbox Code Playgroud)
打印结果:
1
end at 1
0
Run Code Online (Sandbox Code Playgroud)
向量对象v只有1个容量,但它的迭代器可以在end()迭代器之后访问内存.对这种情况有什么保护吗?
迭代器不能防止访问不存在的元素,因为它们应该保证最小的开销.这同样适用std::vector::operator[].在std::vector::end()使用这些方法之一或之外访问元素会产生未定义的行为,并且在事实之后无法检测到它.
但是,std::vector::at()成员函数会抛出std::out_of_range这些情况.可以优雅地捕获和处理此异常.为迭代器实现此功能会因边界检查而引入运行时开销.它还会引入空间开销,因为迭代器现在不仅需要知道当前元素,还需要了解它迭代的向量.
| 归档时间: |
|
| 查看次数: |
378 次 |
| 最近记录: |