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 有一个名为 typeid
的 operator
,您可以使用它。
示例:
#include <iostream>
#include <typeinfo>
using namespace std;
int main()
int i;
cout << typeid(i).name();
return 0;
输出:int
您可以采用任何数据类型,而不仅仅是内置的。
【讨论】:
其实它不是一个方法,它从C++98开始就有了。以上是关于c ++如何按类类型对向量进行排序的主要内容,如果未能解决你的问题,请参考以下文章