6

拼接是如何工作的?我在http://www.cplusplus.com/reference/list/list/splice/中读到了它

我无法从上面链接中的代码中理解这部分:

mylist1.splice ( mylist1.begin(), mylist1, it, mylist1.end());
4

4 回答 4

5

假设您有一个包含以下内容的整数列表:

[1, 2, 3, 4, 5]

现在,您在名为的列表中创建一个迭代器,并将it其推进 3 个位置:

[1, 2, 3, 4, 5]
          ^
          'it' points here

然后将列表拼接到自身,到列表的开头(第一个参数),在同一个列表(第二个参数)中,从it(第三个参数)指向的位置,到结尾(第四个参数),结果如下:

[4, 5, 1, 2, 3]

因此,您有效地将两个元素的列表向右旋转。

于 2012-12-12T10:05:35.960 回答
4

您需要提供源的原因list是,否则无法从中删除元素。

于 2012-12-12T10:24:52.460 回答
1

splice 函数的第四个参数将您的范围移动(而不是复制)到您由第一个参数指定的位置。

在您的示例中,您将列表中的元素移动到列表中的另一个位置(更准确地说是列表的末尾到开头)。

于 2012-12-12T10:06:56.960 回答
1
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被移动的迭代器。在第二个重载中,范围 fromstartfinish但不是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列表的开头移动到开头。

于 2012-12-12T10:27:01.630 回答