1

これは、私が実験している簡単なバブルソートです。

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 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

何故ですか?

4

3 に答える 3

4

swap参照によって引数を取ります。コードの最初のバージョンでは、(正しく) 次のように記述します。

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

たとえば、2 つの整数を交換する方法を考えてみましょう。

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

したがって、swap最初の正しいバージョンで行った逆参照を反映する必要があります。

swap(*bubble, *(bubble + 1));
//   ^ here   ^ and here
于 2013-09-06T19:15:19.293 に答える
2

逆参照する必要があります:

swap (*bubble, *(bubble + 1));
于 2013-09-06T19:14:55.060 に答える