拼接是如何工作的?我在http://www.cplusplus.com/reference/list/list/splice/中读到了它
我无法从上面链接中的代码中理解这部分:
mylist1.splice ( mylist1.begin(), mylist1, it, mylist1.end());
拼接是如何工作的?我在http://www.cplusplus.com/reference/list/list/splice/中读到了它
我无法从上面链接中的代码中理解这部分:
mylist1.splice ( mylist1.begin(), mylist1, it, mylist1.end());
假设您有一个包含以下内容的整数列表:
[1, 2, 3, 4, 5]
现在,您在名为的列表中创建一个迭代器,并将it
其推进 3 个位置:
[1, 2, 3, 4, 5]
^
'it' points here
然后将列表拼接到自身,到列表的开头(第一个参数),在同一个列表(第二个参数)中,从it
(第三个参数)指向的位置,到结尾(第四个参数),结果如下:
[4, 5, 1, 2, 3]
因此,您有效地将两个元素的列表向右旋转。
您需要提供源的原因list
是,否则无法从中删除元素。
splice 函数的第四个参数将您的范围移动(而不是复制)到您由第一个参数指定的位置。
在您的示例中,您将列表中的元素移动到列表中的另一个位置(更准确地说是列表的末尾到开头)。
void list<T,Allocator>::splice ( iterator position, list<T,Allocator>& x, iterator i );
void list<T,Allocator>::splice ( iterator position, list<T,Allocator>& x, iterator start, iterator finish );
仅通过查看很难看出,因为我们有 2 个列表和 2 个迭代器。
话position
虽如此。它说明了在哪里执行insert
.
i
被移动的迭代器。在第二个重载中,范围 fromstart
到finish
但不是finish
自身被移动。finish
可能是列表的结尾。
position
必须属于this
列表。迭代器必须属于x
列表。元素被插入position
到源(this)列表的前面,同时从x
列表中删除。
请注意,cplusplus.com 声明迭代器一旦拼接就会失效,但实际上并非如此,它们仍然有效。
cplusplus.com 是正确的,因为它position
可能不是拼接元素之一(在列表相同的情况下)
在您的示例中:
mylist1.splice ( mylist1.begin(), mylist1, it, mylist1.end());
it
必须是 mylist1 中的迭代器。看来它一定不是mylist1.begin()
。
您的操作将所有元素从it
列表的开头移动到开头。