Swap() 函数的什么实现更好,适用于什么情况
What implementation of Swap() function is better and for what situations?
我定义了两个函数:
1).
template<class T> inline
void swap(T &first, T &second)
{
if (&first != &second)
{
T tmp = first;
first = second;
second = tmp;
}
}
2).
template<typename T>
inline void SwapMe(T *first, T *second)
{
if(*first != *second)
{
T tmp = *first;
*first = *second;
*second = tmp;
}
}
哪个实现更好(第一个等于 std::swap() )?
第一个版本最好使用通过引用传递或按值传递的变量。
第二个更适合指向值的指针。
它们是不同的,因为引用与指针是不同的动物。
除了第一个,两者都不好,因为我更喜欢它。 其他人会更喜欢第二个,因为他们认为应该在调用者的末尾明确说明函数可能会修改其参数。 我认为,如果你不知道函数做什么,就不应该调用函数,它们做什么应该从它们的名字上看出来,就像交换一样。 我还认为,C++中原始指针的唯一目的是作为非拥有、可重新定位和/或可无效的引用。 除非有必要实现自己的内存管理类,例如标准库中的类。
没有人说案例 2 是危险的。如果您的代码将包含 NULL 指针,您是否会收到程序崩溃:交换我(空、空)
标准函数模板与您的swap
大致相同(即std::swap
),并且有一个标准函数模板与您的SwapMe
大致相同(即std::iter_swap
)。
两者都不是真正的"更好",它们各有用途。它们中的任何一个都可以使用另一个来实现,但是在标准iter_swap
中发生时,它是根据swap
定义的,因此swap
被认为是更基本的操作。对于自己的类型,ADL 过载是swap
的。
在代码中,SwapMe
中的*first != *second
测试非常可疑。它需要T
才能有operator!=
,而且考虑到某些类型的!=
可能很慢,它并不是一个很大的优化,所以它为常见情况增加了相当大的成本(当对象不相等时)。此外,根据类型T
的定义,交换相等的对象可能会产生影响(例如,在vector
的情况下,容量不参与相等比较,但在使用 std::swap
或 vector::swap
交换时交换)。所以目前SwapMe
更糟,但我怀疑这不是故意的:-)
事实上,swap
函数中的任何此类测试都是可疑的,因为它往往会减慢常见情况的速度,即使只是几分钟。但是,如果您使测试相同,那么它们是否应该存在与参数类型应该是什么是一个单独的参数。
- C++:将控制台输出存储在宏中更好吗
- FFmpeg:制作一个应用程序比直接使用ffmepg更好吗
- 初始化具有非默认构造函数的std::数组项的更好方法
- 有没有比在库中添加一个并非由所有派生类实现的新虚拟函数更好的设计实践
- 为什么新的随机库比std::rand()更好
- 将中间变量用于三元运算符(或类似运算符)以获得更好的性能
- 适用于 8 位 MCU 的更快 16 位乘法算法
- 比如果其他更好的方式..用于线性插值
- CUDA:是将 M[][] 用于 2D 静态数组还是将它们展平为 M[] 更好
- 我是否应该将 const 用于局部变量以获得更好的代码优化
- 哪个是用于将整数除以 2 的更好选择
- C++11的结合函数可以用于std(甚至更好的mtl)载体吗?
- 用于存储地址的单列列表的数据结构,更好地在C++中查找O(1)
- 什么是适用于C或C++的好MySQL库
- 一个很好的c++编程环境,适用于Mac OS X
- PlaySound()适用于1个声音,是否有更多的函数
- 更好的设计模式用于读取其他进程内存
- 动态 3D 数组不适用于我的类(使用向量会更好吗?
- C++:如何将%USERPROFILE%路径转换为文件路径(应该适用于Windows XP及更高版本)
- 有没有更好的方法可以通过模板用预先计算的值填充数组(用于运行时)