gpt4 book ai didi

c++ - 为什么每个 STL 容器都有一个定义为成员函数的交换函数?

转载 作者:可可西里 更新时间:2023-11-01 17:55:37 29 4
gpt4 key购买 nike

考虑 queue STL 中的容器。

据我了解swap()<algorithm> 中可用标题会工作得很好。

我明白 swap()只会复制 queue表面上的实例,即只有 frontrear指针将与 size 一起被复制, 和其他数据成员。

两个队列中的条目不会物理交换位置,但我不明白为什么在任何情况下都需要这样做,因为一旦交换指针和大小,两个队列就会有效地交换。

最佳答案

在 C++11 引入移动语义之前,std::swap 的泛型实现别无选择,只能进行两次复制。从概念上讲,这:

template <class T>
void swap(T &a, T &b)
{
T t(a);
a = b;
b = t;
}

请注意,这个泛型 std::swap 对传入对象的内部结构一无所知(因为它可以用任意用户类型调用,例如例如),因此必须进行复制。请注意,对于容器,这意味着复制元素。

提供一个优化的成员函数 swap,它只是重新指向一些内部指针,因此是一个巨大的性能胜利。

自从引入移动语义以来,通用交换可以使用移动变得更高效。同样,从概念上讲:

template <class T>
void swap(T &a, T &b)
{
T t(::std::move(a));
a = ::std::move(b);
b = ::std::move(t);
}

当然,在实践中,它可能对涉及的移动操作有非抛出的要求,以及各种额外的位。

有了移动语义,优化后的成员版本可能没有以前那么重要了。但是,在了解类型的确切实现细节的情况下,交换它仍然有可能比三个通用步骤更快。


除了上面的讨论之外,请注意 std::swap 的类型特定重载几乎适用于标准库中定义的所有类型。这些重载所做的只是在其中一个操作数上调用优化的 swap 成员函数。这样,您就拥有了两全其美的优势:一个通用的自由函数 swap,它可以被任何东西调用,但它对标准库所知道的一切都进行了优化实现。

可以放弃成员函数并直接在 std::swap 重载中提供优化的实现,但这意味着它们可能需要成为 friend 并且可以被视为用户代码的可访问性更差。

关于c++ - 为什么每个 STL 容器都有一个定义为成员函数的交换函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42718327/

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