c*****z 发帖数: 182 | 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 |
N**s 发帖数: 837 | 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;
|
c*****z 发帖数: 182 | 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
|
X****r 发帖数: 3557 | 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指针本身构造方式有关吗?
|
p****o 发帖数: 1340 | 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;
|