首页 > 试题广场 >

以下代码执行后,it 的数据为: std::list...

[单选题]
以下代码执行后,it的数据为()
std::list<int> temp;
std::list<int>::iterator it = temp.begin();
it = --it;


  • 未知
  • temp.end()
  • 异常
  • NULL
这个是双链表容器啊,前驱和后继逻辑上的相邻,地址并不相邻呀,迭代器减,是在地址上减减的,就异常了
发表于 2021-01-19 01:29:34 回复(2)
这个可能跟编译器有关?在vs2019上测试是C异常 而在Ubuntu上用gcc测试结果是B end指针
发表于 2020-09-27 07:21:29 回复(0)
先说结论  选c
_STL_VERIFY(_New_ptr != _Mycont->_Myhead, "cannot decrement begin list iterator");
"cannot decrement begin list iterator"这段代码是vs2017抛出的异常信息


发表于 2020-03-07 23:54:43 回复(4)
应该是和编译器有关,GCC可以通过编译。同时我记得STL是有多个实现版本的?
发表于 2022-03-15 03:07:48 回复(0)
#include <iostream>
#include <list>

int main()
{
    std::list<int> a;
    std::list<int>::iterator it = a.begin();
    it = --it;
    std::cout << "abc" << std::endl;
}
使用代码测试,在Ubuntu上没有抛出异常!
发表于 2020-06-17 13:14:05 回复(1)
我学的STL里的list是双向循环链表,所以--it就到.end()
发表于 2023-08-28 17:45:46 回复(0)

为什么不选a呀?

迭代器不是可以看作指针吗?若前面一个地址正好放一个int类型的数据,不是正常的吗?

发表于 2019-11-20 07:50:15 回复(1)

这个跟编译器有关系吧,我记得gcc,mingw编译出来是temp.end(),但是vs2019编译出来就是异常

编辑于 2024-03-06 15:42:10 回复(0)
std::list<int> temp;创建了一个空的list。
std::list<int>::iterator it = temp.begin();将it指向了temp的开始位置,但是由于temp是空的,所以it指向的是一个不存在的位置。
it = --it;将it向前移动一个位置,但是由于it已经指向了不存在的位置,所以这个操作是未定义的行为,可能会导致程序崩溃或者出现其他问题。
发表于 2023-11-15 21:02:53 回复(0)
优班图不报错,vs报错。
发表于 2022-11-25 00:09:02 回复(0)
GCC的STL实现经过前置--运算符后会到end()迭代器指向的位置;因为list是环形链表的实现

发表于 2022-08-02 16:01:58 回复(1)
gcc编译器选择B
发表于 2022-07-07 11:05:46 回复(0)
redhat7中g++测试  it==temp.end()。
发表于 2022-06-15 22:00:00 回复(0)
双向链表容器地址是非连续,--it自然就不知道跑哪去了
发表于 2021-04-23 10:49:13 回复(0)
<p>指针不能乱指,都有内存保护的。</p>
发表于 2021-04-02 18:48:07 回复(0)
<p>理论上是异常,但单着两行代码确实没报错 测出来是B</p>
发表于 2020-08-04 07:41:31 回复(0)
亲测B
发表于 2020-07-31 21:21:25 回复(1)
感觉答案有问题,不解引用的话不会出错
发表于 2020-02-06 15:41:12 回复(0)