gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 13:21:53 29 4
gpt4 key购买 nike

如果当迭代器指向 vector 的最后一个元素时,我将迭代器增加 2 会怎样?在 this question询问如何通过 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

在遍历 vector 和其他容器时,我曾多次看到建议与 vector::end() 进行比较:

for( vector<int>::iterator it = vec.begin(); it != vec.end(); it++ ) {
//manipulate the element through the iterator here
}

显然,如果迭代器超过循环内的最后一个元素,则 for 循环语句中的比较将评估为 false,并且循环将愉快地继续进行未定义的行为。

如果我曾经在迭代器上使用Advance() 或任何类型的增量操作并使其指向容器的末端,我是否正确,我将无法检测到这种情况?如果是这样,最佳做法是什么 - 不使用此类改进?

最佳答案

以下是 Nicolai Josuttis 书中的引述:

Note that advance() does not check whether it crosses the end() of a sequence (it can't check because iterators in general do not know the containers on which they operate). Thus, calling this function might result in undefined behavior because calling operator ++ for the end of a sequence is not defined

换句话说,将迭代器维护在范围内的责任完全在于调用者。

关于c++ - 如果增加一个等于 STL 容器的结束迭代器的迭代器会发生什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1057724/

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