C++中的字符串排序

Posted

技术标签:

【中文标题】C++中的字符串排序【英文标题】:String Sorting in C++ 【发布时间】:2014-05-30 21:51:39 【问题描述】:

我实现了自己的ls 程序。这是终端中的示例输出:

-rwxr-xr-x 1 2255 May 14 05:54 rc
-rwxr-xr-x 1 27271 Oct 01 05:25 rc.sysinit
-rwxr-xr-x 1 548752 Feb 23 05:34 rmt
-rwxr-xr-x 1 742 Oct 01 14:28 auto.smb
-r-xr-xr-x 1 2346 Sep 16 14:33 iptables.rules

有没有办法可以根据文件名对其进行排序?目前,我在每次检查文件信息(文件类型、权限、大小等)后立即打印数据。我是否需要将信息保存到 stl list 之类的容器中,然后使用 stl sort?但是如何使用 stl sort 对文件名进行排序呢?

【问题讨论】:

在获得文件信息之前进行排序会更容易,因为您所拥有的只是文件名列表。 注意std::list有一个专用的sort成员函数; std::sort 对例如更有用vectors 和数组。 【参考方案1】:

这取决于您获取文件信息的方式。如果您只是枚举容器,则需要将所有文件信息存储到某种结构中,然后对结果进行排序。

但是,如果您在某个时候拥有所有文件名并获取它们的属性,理想情况下您只想对该列表进行排序(再次存储整个内容并进行排序)。

std::sort 的重载带有一个比较函数,您可以使用它来手动比较两个项目。

【讨论】:

【参考方案2】:

是的,要对结果进行排序,您(几乎)需要在排序之前将中间数据存储到某种容器中。

如果您总是(或至少默认情况下)要对一个特定字段进行排序,您可以指定 operator< 以根据该字段进行比较。如果您想支持对其他各种字段进行排序,您可以为每个字段指定比较函子,或者(如果您的编译器支持,则首选)使用 lambda 表达式来指定比较。

class file 
    std::string name;
    // ... 
public:
    bool operator<(file const &other) const  
        return name < other.name;
    
;

// ...
std::vector<file> files;

// sort by name (default order):
std::sort(files.begin(), files.end());

// sort by a "size" member (which needs to be accessible):
std::sort(files.begin(), files.end(), 
    [](file const &a, file const &b)  
        return a.size < b.size; 
    );

【讨论】:

以上是关于C++中的字符串排序的主要内容,如果未能解决你的问题,请参考以下文章

C++:使用 LSD 基数排序对字符串进行排序崩溃

C++:假如有一些学生,提供学生的名字(字符串)和成绩,如何根据给定名字的字典序从小到大排序

C++ 排序类字符串数组

c ++中的字符串排序也没有在第5个元素处正确排序[关闭]

对 C++ 字符串的字符进行排序

C++ 按字母顺序排序字符串