avatar
stl 源代码疑问# Programming - 葵花宝典
c*z
1
在list中有两个操作insert和erase,它们都是返回一个iterator的类型,可是在代码
中返回的方式不同,如下:
在insert中:
iterator insert(iterator __position, const _Tp& __x) {
_Node* __tmp = _M_create_node(__x);
__tmp->_M_next = __position._M_node;
__tmp->_M_prev = __position._M_node->_M_prev;
__position._M_node->_M_prev->_M_next = __tmp;
__position._M_node->_M_prev = __tmp;
return __tmp;
}
在erase中:
iterator erase(iterator __position) {
_List_node_base* __next_node = __position._M_node->_M_next;
_List_nod
avatar
N*s
2
in insert, _M_create_node is like a factory, ctor called in _Construct
in erase, it's constructed from base_node using ctor

【在 c*****z 的大作中提到】
: 在list中有两个操作insert和erase,它们都是返回一个iterator的类型,可是在代码
: 中返回的方式不同,如下:
: 在insert中:
: iterator insert(iterator __position, const _Tp& __x) {
: _Node* __tmp = _M_create_node(__x);
: __tmp->_M_next = __position._M_node;
: __tmp->_M_prev = __position._M_node->_M_prev;
: __position._M_node->_M_prev->_M_next = __tmp;
: __position._M_node->_M_prev = __tmp;
: return __tmp;

avatar
c*z
3
不太明白什么意思,能否再仔细讲解一下
我知道insert里用的是displacement new, 而erase里只是指针操作,没有创建新的节点
我的问题是,他们返回iterator的时候,一个隐式调用构造函数,一个显式,这个和
node指针本身构造方式有关吗?

【在 N**s 的大作中提到】
: in insert, _M_create_node is like a factory, ctor called in _Construct
: in erase, it's constructed from base_node using ctor

avatar
X*r
4
I don't think there is any real difference between the two. It seems that
the explicit construction for the latter just improves readability because
of the cast before it.

节点

【在 c*****z 的大作中提到】
: 不太明白什么意思,能否再仔细讲解一下
: 我知道insert里用的是displacement new, 而erase里只是指针操作,没有创建新的节点
: 我的问题是,他们返回iterator的时候,一个隐式调用构造函数,一个显式,这个和
: node指针本身构造方式有关吗?

avatar
p*o
5
no much deep thought here. if you are the author of this code, you
will almost sure do the same thing.

【在 c*****z 的大作中提到】
: 在list中有两个操作insert和erase,它们都是返回一个iterator的类型,可是在代码
: 中返回的方式不同,如下:
: 在insert中:
: iterator insert(iterator __position, const _Tp& __x) {
: _Node* __tmp = _M_create_node(__x);
: __tmp->_M_next = __position._M_node;
: __tmp->_M_prev = __position._M_node->_M_prev;
: __position._M_node->_M_prev->_M_next = __tmp;
: __position._M_node->_M_prev = __tmp;
: return __tmp;

相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。