gpt4 book ai didi

c++ - 为什么 std::list::splice 不是一个自由函数?

转载 作者:搜寻专家 更新时间:2023-10-31 00:27:41 24 4
gpt4 key购买 nike

Splice是一个成员函数,它在常数时间内将一个链表的一部分放入另一个链表。

为什么它需要是一个成员函数?我希望我可以将迭代器拼接到列表中,并在列表本身上有一个句柄。为什么要拼接的列表除了起始迭代器和结束迭代器之外还需要作为参数?

为了测试,我制作了三个列表并混合了容器和迭代器。 请参阅下面的拼接,其中容器(空)与迭代器(test0 和 test1)不匹配:

list<int> test0;
list<int> test1;
list<int> empty;
test0.push_back(1);
test0.push_back(2);
test0.push_back(3);
test1.push_back(4);
test1.push_back(5);
test1.push_back(6);
empty.splice(test0.end(), empty, test1.begin(), test1.end());
printf("empty size: %ld\n", empty.size());
printf("test0 size: %ld\n", test0.size());
printf("test1 size: %ld\n", test1.size());
for (const auto& i : test0) {
printf("%d\n", i);
}

令人惊讶的是,一切都很好,甚至是尺寸!

empty size: 0
test0 size: 6
test1 size: 0
1
2
3
4
5
6

我可以稍微理解迭代的工作原理,因为它一直运行到 next 为 null,而不考虑容器的前/后指针。但是它是如何得到正确的尺寸的呢?也许大小是动态计算的?

编辑基于this explanation的大小,大小在线性时间内为列表动态计算的。所以容器实际上只是一个伪参数。也许只有在添加新元素时才需要它,因为它具有用于在列表中创建新节点的分配器?

最佳答案

std::list::splice修改容器的大小。您不能使用容器的迭代器来修改它的大小。您会注意到标准库中没有可以仅使用迭代器将新元素插入范围的免费函数。他们充其量可以重新排列它们。

例如,std::remove在容器的末尾打乱要删除的元素,并返回一个迭代器,该迭代器标识需要删除的元素范围。它不能真正从范围本身中删除元素。

有一些解决方法,例如使用 std::back_inserter , 但这是通过模拟一个未绑定(bind)的范围来实现的。

关于c++ - 为什么 std::list::splice 不是一个自由函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48083925/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com