相关疑难解决方法(0)

如果增加一个等于STL容器的结束迭代器的迭代器,会发生什么

如果我将迭代器指向向量的最后一个元素时,它会增加2怎么办?在这个询问如何通过2个元素调整到STL容器的迭代器的问题中,提供了两种不同的方法:

  • 使用算术运算符的形式 - + = 2或++两次
  • 或者使用std :: advance()

当迭代器指向STL容器的最后一个元素或更远时,我用VC++ 7测试了它们的边缘情况:

vector<int> vec;
vec.push_back( 1 );
vec.push_back( 2 );

vector<int>::iterator it = vec.begin();
advance( it, 2 );
bool isAtEnd = it == vec.end(); // true
it++; // or advance( it, 1 ); - doesn't matter
isAtEnd = it == vec.end(); //false
it = vec.begin();
advance( it, 3 );
isAtEnd = it == vec.end(); // false
Run Code Online (Sandbox Code Playgroud)

我已经看过有时可以建议在遍历vector和其他容器时与vector :: end()进行比较:

for( vector<int>::iterator it = vec.begin(); it != vec.end(); …
Run Code Online (Sandbox Code Playgroud)

c++ iterator stl vector

62
推荐指数
3
解决办法
3万
查看次数

在STL迭代器的上下文中,什么是单数和非奇异值?

C++标准(2003)第24.1/5节中的内容如下:

正如指向数组的常规指针一样,它保证指针值指向数组的最后一个元素,因此对于任何迭代器类型,都有一个迭代器值指向相应容器的最后一个元素.这些值称为past-the-end值.定义表达式*i的迭代器i的值称为可解除引用.库从不假设过去的值是可解除引用的.迭代器也可以具有与任何容器无关的奇异值. [示例:在声明未初始化的指针x(与int*x;一样)之后,必须始终假定x具有指针的奇异值.] 对于奇异值,大多数表达式的结果是未定义的.唯一的例外是将非奇异值赋给包含奇异值的迭代器.在这种情况下,奇异值将以与任何其他值相同的方式被覆盖.可解除引用的值总是非奇异的.

我真的不明白粗体显示的文字?

  • 什么是奇异值和非奇异值?他们是如何定义的?在哪里?
  • dereferenceable值如何以及为何总是非奇异的?

c++ standards pointers iterator stl

10
推荐指数
2
解决办法
3878
查看次数

标签 统计

c++ ×2

iterator ×2

stl ×2

pointers ×1

standards ×1

vector ×1