c ++如何按类类型对向量进行排序

Posted

技术标签:

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

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

【问题讨论】:

【参考方案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开始就有了。

以上是关于c ++如何按类类型对向量进行排序的主要内容,如果未能解决你的问题,请参考以下文章

如何对 <class*> 类型的向量进行排序? [复制]

如何对用户定义类型的非常大的向量进行排序

如何在 C++ 中对向量组元素进行排序?

如何对R中元素包含字母和数字的字符向量进行排序?

如何对R中的列表中的元素进行排序?

对多维向量进行排序