解引用c++ STL列表迭代器
Dereferencing C++ STL list iterator
我像这样循环遍历两个STL列表(L1, L2):
list<int>::const_iterator itr1 = L1.begin();
list<int>::const_iterator itr2 = L2.begin();
for (itr1; itr1 != L1.end(); itr1++) {
if (*itr1 < *itr2) {
//some code
}
}
编译得很好,但是当我运行它的时候,它显示"Expression: list iterator not derefencable "
现在,在类中,我们制作了一个模拟版本的STL列表,我们编写了自己的STL列表,并重载了*操作符来解引用迭代器。然而,显然它在这里不起作用。
如何解引用迭代器,或者如果STL列表的方法不同,它是如何做的。我看了这个:
http://www.sgi.com/tech/stl/List.html文档,似乎没有找到任何接受成员"reference"的东西,但仍然不知道如何引用迭代器指向的对象,除非它是列表的第一部分或最后一部分。
有人知道这是怎么回事吗?谢谢你
这里是粘贴目录:
http://pastebin.com/YRddqjmN这个(特定于实现的)消息告诉我,您解引用了一个无效的迭代器。这与语法/编译时语义无关,所以编译器没有抱怨也就不足为奇了。但是请注意,迭代器确实具有运行时语义:在这种情况下,我打赌代码调用时带有空的L2
列表,因此itr2 == L2.end()
。这意味着*itr2
导致未定义行为。幸运的是,这似乎会触发一个错误消息,而不是在你的脸上爆炸。
我猜:
L2
为空,因此L2.begin()
与L2.end()
相同。
这意味着L2.begin()
返回一个不可引用的迭代器,因此你调用了未定义的行为。
while ( *itr2 < *itr1 ) {
itr2++;
}
该代码没有检查L2的结束。也许可以添加itr2 != L2.end()
检查
只要在列表范围内,即[list.begin(), list.end()],当列表不为空时,标准列表迭代器就可以被解引用。
其他答案是正确的,因为两个错误,一个错误的列表迭代器正在被解引用。查看粘贴目录
这个条件是反向的:
if ( (*itr1 == *itr2) && (itr2 != L2.end()) ) {
应该是
if ( (itr2 != L2.end()) && (*itr1 == *itr2) ) {
,以便在使用itr2之前检查它是否有效。同样,第一个条件
if ( L1.empty() && L2.empty() ) {
cout << "Returning an empty list because the two arugment lists were emptynn";
应该是一个析取:
if ( L1.empty() || L2.empty() ) {
cout << "Returning an empty list because at least one of the two argument lists was emptynn";
,但它甚至不是真正必要的。
(哦,还有,你知道set_intersection吗,它是标准库的一部分?)
- C++列表迭代器
- C++不能取消引用结束列表迭代器
- 创建以向量/列表迭代器为键的映射
- 使用列表迭代器获取所有值
- 将列表迭代器存储为成员
- 将列表 en 列表迭代器作为指针 C++ 传递
- 空列表迭代器比较始终为真
- 对列表迭代器指向的对象不起作用的引用
- 射击时从列表中删除外星人 - 找出循环;"表达式:无法递增结束列表迭代器"
- 擦除后重构列表迭代器
- 外部双重链接列表迭代器C
- 列表迭代器不可取消引用
- 断言失败,列表迭代器不可取消引用
- 列表迭代器不可递增?- 运行时错误
- 试图在for循环中有2个列表迭代器
- 如何制作一个指向列表迭代器的指针,以作为参数传递到函数中
- STL 列表迭代器不会更新我的对象
- 列表迭代器与矢量迭代器
- C++中非常量列表迭代器的奇怪行为
- C++列表迭代器如果列表更改则重新启动操作