【问题标题】:String Sorting in C++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 和数组。

标签: c++ sorting stl


【解决方案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; 
        });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-04
      • 2016-01-29
      • 2012-03-10
      • 2014-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多