我正在尝试自己实现所有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}}下具有可比性。操作
答案 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