| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 878 人关注过本帖
标题:关于list重载->运算符的疑惑
只看楼主 加入收藏
lllyyy3
Rank: 2
等 级:论坛游民
威 望:1
帖 子:24
专家分:20
注 册:2022-10-15
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:4 
关于list重载->运算符的疑惑
这个是《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'.
网上不是没有就是搜出来的感觉不是我想要问的,故发此贴,希望大佬解答一下,谢谢!
搜索更多相关主题的帖子: 重载 list 运算符 报错 cout 
2022-11-01 13:12
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9031
专家分:54061
注 册:2011-1-18
收藏
得分:0 
1. 不是
2. -> 怎么成为双目运算符了?operator->() 是用来代理指针的
3. 与2相同
假如 list<int> 改为 list<有成员名为foo的类型T>
那么可以 iter->foo
也就是 iter 表现得好像 T*,但它不是 T*
2022-11-01 17:10
lllyyy3
Rank: 2
等 级:论坛游民
威 望:1
帖 子:24
专家分:20
注 册:2022-10-15
收藏
得分:0 
以下是引用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改名,各种模板,大佬有没有什么建议?
2022-11-01 20:56
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9031
专家分:54061
注 册:2011-1-18
收藏
得分:20 
不好意思,第一问我看错了,应该回答“是”。但第一问的第二个小问,我不懂,因为代码太少了,如果让我猜的话,应该是想隔离一个内部带实现细节的迭代器self,以及给别人使用清爽隐藏实现的迭代器iterator。

stl源码看的很痛苦 ------ 我觉得大致了解一下相关算法就可以了。不了解源码的话,就用不好它;但过于纠结于实现细节,并没有太大意义。
2022-11-01 23:30
lllyyy3
Rank: 2
等 级:论坛游民
威 望:1
帖 子:24
专家分:20
注 册:2022-10-15
收藏
得分:0 
以下是引用rjsp在2022-11-1 23:30:48的发言:

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

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

行,谢谢r老师。
2022-11-02 00:22
快速回复:关于list重载->运算符的疑惑
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016810 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved