如何在对象类型未知时实现swap函数

时间:2014-12-24 16:32:38

标签: c++

我正在尝试自己实现所有STL函数。

make_heap函数中,我需要交换两个对象。现在,因为我想要STL,所以我不能改变我的论点列表。

所以我无法声明object所指向的first变量。

我也无法使用swap without temporary variables

swap (RandomAccessIterator a,RandomAccessIterator b)
{
    *a = *a + *b;
    *b = *a - *b;
    *a = *a - *b;
}

因为两个指针指向的给定对象的运算符+-可能不会重载。

这是我的代码:

template <class RandomAccessIterator>

void make_heap (RandomAccessIterator first,RandomAccessIterator last)
{

    int num_ele = (last - first) + 1;
    for (int i=num_ele-1;i>=1;i--)
    {
        if (first[i] < first[(i-1)/2])
        {
            swap (/* Here is where i am struck..! */);
        }
    }


}

PS:假设objects在&lt; {1}}下具有可比性。操作

4 个答案:

答案 0 :(得分:3)

您可以使用(在C ++ 11中):

void iter_swap(RandomAccessIterator a, RandomAccessIterator b)
{
    auto temp(std::move(*a));
    *a = std::move(*b);
    *b = std::move(temp);
}

或使用std::iterator_traits

void iter_swap(RandomAccessIterator a, RandomAccessIterator b)
{
    std::iterator_traits<RandomAccessIterator>::value_type temp(std::move(*a));
    *a = std::move(*b);
    *b = std::move(temp);
}

答案 1 :(得分:1)

您不应该尝试交换给您的值,而是让库和用户提供正确的方式来交换您感兴趣的类型的值:

using std::swap;
swap(a,b);

该实现使用using声明将std::swap置于范围内,然后使用对swap的非限定调用,该调用将找到std::swap泛型函数,并且可能是用户提供的ADL发现功能。如果有这样的功能,它将优先于标准功能。

简短的故事:你应该关心如何交换值,库知道,并且用户有一个扩展点,如果他们想要调整特定类型的行为超出了标准swap。该扩展点是ADL找到的swap

答案 2 :(得分:0)

您可以将swap实施为模板功能

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

并从您的代码中调用它:

swap(*a, *b);

此外,用户还可以定义用于交换的模板专门化。

答案 3 :(得分:-2)

你不能在这里使用XOR交换算法吗? http://en.wikipedia.org/wiki/XOR_swap_algorithm