1

我正在尝试做一个对 3 个元素进行排序的模板函数,
数字(int,double)工作正常,但字符串的行为不符合预期

#include <cstdlib>
#include <algorithm>
#include <iostream>

using namespace std;

template<typename TYPE>
void sort3(TYPE n1, TYPE n2, TYPE n3) {
    TYPE arr[3];
    arr[0] = n1;
    arr[1] = n2;
    arr[2] = n3;
    sort(arr, arr + 3);

    for (int i = 0; i < 3; i++) {
        cout << arr[i] << " ";
    }
    cout << endl;
}

int main(int argc, char** argv) {
    sort3("B", "Z", "A");
    sort3(10.2, 99.0, 1.9);
    sort3(200, 50, 1);
    return 0;
}

给我以下输出:

AZB

1.9 10.2 99

1 50 200

sort3("B", "Z", "A");据我了解A B Z
,它不是特定于操作系统的,因为它在在线编译器
中给了我相同的结果, 那里发生了什么?

4

3 回答 3

4

那是因为您传递的是字符串文字,它们是字符数组。当将它们作为参数传递给函数时,数组会衰减为指针。因此,您要排序的是这些指针的(而不是它们指向的字符串)。

尝试这个:

#include <string>

// ...

sort3(std::string("B"), std::string("Z"), std::string("A"));

operator <这是有效的,因为存在for的重载std::string,并且在自定义比较器未作为第三个参数传递时用于比较元素(这是您的情况)std::sortoperator <

于 2013-04-21T14:04:22.267 回答
3

您最终会比较指针而不是实际的字符串内容。解决它的一种方法是这样的:

sort3(std::string("B"), std::string("Z"), std::string("A"));
于 2013-04-21T14:04:02.637 回答
1

如果您想继续调用 sort3 ,const char*您可以添加一个“专业”模板:

template<>
void sort3(const char* n1, const char* n2,const char* n3) {
    sort3( string(n1), string(n2), string(n3));
}

sort3("B", "Z", "A"); 也将起作用。

但是您的问题“那里发生了什么?” Andy Prowl 已经回答了。

于 2013-04-21T14:43:09.150 回答