0

我定义了两个函数:

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() )?

4

4 回答 4

1

没有人说案例 2 是危险的。如果您的代码将包含 NULL 指针,您是否会收到程序崩溃:SwapMe (NULL, NULL)

于 2013-01-23T05:31:12.917 回答
1

第一个版本更好地使用通过引用传递或通过值传递的变量。

第二个更适合指向值的指针。

它们是不同的,因为引用是与指针不同的动物。

于 2013-01-23T04:38:00.513 回答
1

有一个标准函数模板与您的(即)大致相同,并且有一个标准函数模板与您的(即)大致相同。swapstd::swapSwapMestd::iter_swap

两者都不是真正的“更好”,它们各有用途。它们中的任何一个都可以使用另一个来实现,但是正如在标准中发生的那样,它iter_swap是根据 定义的swap,因此swap被认为是更基本的操作。这是swap您将为自己的类型进行 ADL 重载。

在您的代码*first != *second中,您的测试SwapMe非常可疑。它需要Thave operator!=,并且考虑到某些类型可能会很慢,这并不是什么优化!=,因此它为常见情况(当对象不相等时)增加了很大的成本。此外,根据类型的定义T,交换相等的对象可能会产生影响(vector例如,在 的情况下,容量不参与相等比较,但std::swap使用or交换时会交换vector::swap)。所以目前SwapMe情况更糟,但我怀疑这不是故意的:-)

事实上,swap函数中的任何此类测试都是可疑的,因为它往往会减慢常见情况,即使只是微小的。但是,如果您使测试相同,那么它们是否应该存在是与参数类型应该是什么不同的参数。

于 2013-01-23T07:34:04.723 回答
1

两者都不是更好,除了第一个,因为我更喜欢它。其他人会更喜欢第二种,因为他们认为应该在调用者端明确说明函数可能会修改其参数。我的想法是,如果您不知道函数的作用,则不应调用它们,并且它们的作用应该从名称中显而易见,就像交换一样。我还认为,C++ 中原始指针的唯一目的是作为非拥有、可重新定位和/或可空引用。除非您有必要实现自己的内存管理类,例如标准库中的那些。

于 2013-01-23T04:46:55.737 回答