gpt4 book ai didi

c++ - 为什么 std::swap 不适用于模板项?

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:26:51 27 4
gpt4 key购买 nike

这是我正在试验的一个简单的冒泡排序:

template<class T>
void bubbleSort(T *begin, T *end) {
for (auto index = begin + 1; index != end; ++index) {
for (auto bubble = begin; bubble != end - 1; ++bubble) {
if (*bubble > *(bubble + 1)) {

const T temp = *bubble;
*bubble = *(bubble + 1);
*(bubble + 1) = temp;
}
}
}
}

这个版本似乎可以工作(冒泡排序的所有优点)。顺便说一句,如果有帮助的话,这是我正在测试的类(class):

class Numbers {
int max;
int *numbers;

public:
Numbers(initializer_list<int> initialList) : max { initialList.size() }, numbers { new int[max] }
{
int index = 0;
for (auto it = initialList.begin(); it != initialList.end(); ++it, ++index) {
numbers[index] = *it;
}
}

int operator *(int index) { return numbers[index]; }
int *begin() { return &numbers[0]; }
int *end() { return &numbers[max]; }
};

我试图做的是使用 std::swap 在我的内部循环中编写手动交换,如下所示:

for (auto bubble = begin; bubble != end - 1; ++bubble) {
if (*bubble > *(bubble + 1)) swap (bubble, bubble + 1);
}

但出于某种原因,编译器告诉我:

error C2665: 'std::swap' : none of the 3 overloads could convert all the argument types

这是为什么?

最佳答案

swap 通过引用获取其参数。在您的代码的第一个版本中,您(正确地)写:

const T temp = *bubble;
*bubble = *(bubble + 1);
*(bubble + 1) = temp;

现在考虑如何交换,例如,两个整数:

const int temp = a;
a = b;
b = temp;
// or more simply
swap(a, b);

因此您的交换 应该反射(reflect)您在第一个正确版本中所做的取消引用:

swap(*bubble, *(bubble + 1));
// ^ here ^ and here

关于c++ - 为什么 std::swap 不适用于模板项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18664952/

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