【问题标题】:c++ how to sort a vector by class typec ++如何按类类型对向量进行排序
【发布时间】:2015-04-07 05:18:14
【问题描述】:

我有一个“mediaInfo”基类,其中包含“Book”、“Video”和“Music”三个派生类。在我的主文件中,我有一个声明为“mediaInfo”类型的向量,它动态分配内存并将向量元素分配给“mediaInfo”“Book”“Video”或“Music”类型,具体取决于测试脚本的输入。代码的另一个功能是按类型(书籍、视频、音乐、媒体信息)、名称和媒体值对向量元素进行排序。我有名字,正在努力按类型排序。如果需要,我可以提供代码。谢谢你。

【问题讨论】:

    标签: c++ class sorting vector


    【解决方案1】:

    向 MediaInfo 添加一个虚拟方法以提供排名信息。例如:

    class MediaInfo {
    public:
        virtual int rank() = 0;
    };
    
    class Book : MediaInfo {
    public:
        virtual int rank() { return 100; }
    };
    
    class Video : MediaInfo {
    public:
        virtual int rank() { return 200; }
    };
    

    然后就可以按照obj->rank()等信息进行排序了;

    【讨论】:

    • 这是一个非常好的解决方案,但请注意它使MediaInfo 抽象化,因此无法实例化。您可以通过在 MediaInfo 类中仅使用虚函数而不是纯虚函数来解决此问题(如果需要)。
    【解决方案2】:

    虽然我看到它不鼓励,但另一种(技术上)有效的排序方式是使用 typeid。快速示例:

    std::vector<MediaInfo*> list;
    list.push_back(new Book());
    list.push_back(new Video());
    list.push_back(new Book());
    list.push_back(new MediaInfo());
    
    std::sort(list.begin(), list.end(), [](MediaInfo* a, MediaInfo* b){ 
        return typeid(*a).hash_code() < typeid(*b).hash_code(); 
    });
    

    话虽如此,另一个答案中提到的虚拟方法可能是实现它的更好方法。
    更多关于 typeid 的陷阱可以找到here.

    【讨论】:

    • 生成的hash_code会按照typename的字典顺序,还是别的什么?
    • @GargAnkit 我相信 hash_code 的返回值未指定(有更多信息here)。但是,如果字典顺序很重要,您可以轻松地按 typeid(someObject).name() 排序。但同样,返回值是特定于编译器的。
    【解决方案3】:

    由于 C++98 有一个名为 typeidoperator,您可以使用它。
    示例:

    #include <iostream>
    #include <typeinfo>
    using namespace std;
    
    int main() {
      int i;
      cout << typeid(i).name();
      return 0;
    }
    

    输出:
    int
    您可以采用任何数据类型,而不仅仅是内置的。

    【讨论】:

    • 其实它不是一个方法,它从C++98开始就有了。
    猜你喜欢
    • 1970-01-01
    • 2015-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-16
    • 2014-11-23
    • 2020-12-05
    • 2020-10-17
    相关资源
    最近更新 更多