使用模板方法进行不一致的字符串排序

Posted

技术标签:

【中文标题】使用模板方法进行不一致的字符串排序【英文标题】:inconsistent string sorting with template method 【发布时间】:2013-04-21 14:01:59 【问题描述】:

我正在尝试做一个对 3 个元素进行排序的模板函数, numbers(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;

给我以下输出:

A Z B

1.9 10.2 99

1 50 200

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

【问题讨论】:

可能重复:***.com/questions/14131491/… 【参考方案1】:

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

试试这个:

#include <string>

// ...

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

之所以有效,是因为存在 std::stringoperator &lt; 重载,并且当自定义比较器未作为第三个参数(这是您的情况)传递时,std::sort 使用 operator &lt; 比较元素。

【讨论】:

我可以创建一个通用比较器,我可以通过"a" 而不是string("a") 吗? @Borian:是的,你可以这样做。只需定义一个具有两个调用运算符的函子,一个用于 const char*,它将从操作数构造 std::string 并比较这些对象,另一个运算符模板将 &lt; 用于任何类型 @Andy Prowl:您如何看待 const char * 的“专门”(当然有更正确的名称)模板函数,用字符串调用 sort3? @hr_117:您可能是指sort3重载,它接受三个const char* 并以这种方式调用通用sort3sort3(std::string(arg1), std::string(arg2), std::string(arg3));。是的,这也是一种可能:)【参考方案2】:

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

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

【讨论】:

【参考方案3】:

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

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 已经回答了。

【讨论】:

以上是关于使用模板方法进行不一致的字符串排序的主要内容,如果未能解决你的问题,请参考以下文章

python中进行字符串排序

排序包含字符串和整数的数组列表

字符串算法—字符串排序(下篇)

如何对字符串列表进行排序?

在 VTL 中对字符串数组进行排序

数组Array.sort()排序的方法