注册 登录
编程论坛 C++教室

关于list重载->运算符的疑惑

lllyyy3 发布于 2022-11-01 13:12, 1085 次点击
这个是《stl源码剖析》里的截图,前2张图是list迭代器的实现代码,第3张是list的结构图,
只有本站会员才能查看附件,请 登录

只有本站会员才能查看附件,请 登录

只有本站会员才能查看附件,请 登录

我想问的是:
1、第1张图,红色框框柱的第2行是不是就是这个迭代器类本身换了个self的名字?那第1行是什么东西?怎么又出来个iterator?
2、第2张图,最下面红色框框柱的operator->()函数居然没有参数,->不应该是双目运算符么,类内默认有个this隐藏了,那还有个右参数怎么不写?
3、第2张图,最下面红色框框柱的operator->()函数为什么返回的是一个指针?返回什么不是看后面接的是data还是next吗?我看->重载的实现是直接调用*的重载然后返回data的地址。这个->运算符和迭代器搭配怎么使用?我下面的代码报错了
程序代码:

#include<iostream>
#include<list>
using namespace std;
int main(){
    list<int> ls;
    ls.push_back(3);
    ls.push_back(2);
    auto iter = ls.begin();
    cout<<*iter<<endl;//3
    cout<<iter->node<<endl;//报错
    cout<<iter->node->next<<endl;//报错
    cout<<iter->node->data<<endl;//报错
return 0;
}

上面3个错都是[Error] request for member 'node' in '* iter.std::_List_iterator<int>::operator->()', which is of non-class type 'int'.
网上不是没有就是搜出来的感觉不是我想要问的,故发此贴,希望大佬解答一下,谢谢!
4 回复
#2
rjsp2022-11-01 17:10
1. 不是
2. -> 怎么成为双目运算符了?operator->() 是用来代理指针的
3. 与2相同
假如 list<int> 改为 list<有成员名为foo的类型T>
那么可以 iter->foo
也就是 iter 表现得好像 T*,但它不是 T*
#3
lllyyy32022-11-01 20:56
以下是引用rjsp在2022-11-1 17:10:34的发言:

1. 不是
2. -> 怎么成为双目运算符了?operator->() 是用来代理指针的
3. 与2相同
假如 list<int> 改为 list<有成员名为foo的类型T>
那么可以 iter->foo
也就是 iter 表现得好像 T*,但它不是 T*


1、那意思是这里的->运算符和访问链表结点常用的操作ptr=ptr->next里的->不是一种是吗?
2、还有还是第1张图的红框那两行,iterator这个类型在后面第2张图的构造函数初始化列表的时候用到了node(x.node);
self是在第2张图!=、==这两个运算符重载的时候用到了,也是node=x.node,说明这个self和iterator是不是一个东西?都是这个迭代器类型。

3、还有个题外话,我看这个stl源码看的很痛苦,源码充满着各种typedef改名,各种模板,大佬有没有什么建议?
#4
rjsp2022-11-01 23:30
不好意思,第一问我看错了,应该回答“是”。但第一问的第二个小问,我不懂,因为代码太少了,如果让我猜的话,应该是想隔离一个内部带实现细节的迭代器self,以及给别人使用清爽隐藏实现的迭代器iterator。

stl源码看的很痛苦 ------ 我觉得大致了解一下相关算法就可以了。不了解源码的话,就用不好它;但过于纠结于实现细节,并没有太大意义。
#5
lllyyy32022-11-02 00:22
以下是引用rjsp在2022-11-1 23:30:48的发言:

不好意思,第一问我看错了,应该回答“是”。但第一问的第二个小问,我不懂,因为代码太少了,如果让我猜的话,应该是想隔离一个内部带实现细节的迭代器self,以及给别人使用清爽隐藏实现的迭代器iterator。

stl源码看的很痛苦 ------ 我觉得大致了解一下相关算法就可以了。不了解源码的话,就用不好它;但过于纠结于实现细节,并没有太大意义。

行,谢谢r老师。
1