类自定义排序的 C++ 向量
Posted
技术标签:
【中文标题】类自定义排序的 C++ 向量【英文标题】:C++ vector of class custom sort 【发布时间】:2013-11-21 12:09:06 【问题描述】:我有 C++ 代码。有一个类向量。我需要以一种有点自定义的方式对这个向量进行排序。
这是我的课:
class Sales
public:
string customer_name;
string category;
string aircraft;
string day;
string time;
int week;
int ticket_price;
string payment;
public:
Sales ()
customer_name = "";
category = "";
aircraft = "";
day = "";
time = "";
week = 0;
ticket_price = 0;
payment = "";
Sales (string f_cat, string airc, string xday, string xtime, int xweek)
customer_name = "";
category = f_cat;
aircraft = airc;
day = xday;
time = xtime;
week = xweek;
ticket_price = 0;
payment = "";
;
假设我们有:
vector <Sales> list;
假设该列表已填充记录,我希望按以下逻辑对其进行排序:
sort_string = day + time + week + category + aircraft;
示例记录:
Sunday, 12:00, 1, Comm, b777
Monday, 10:00, 1, Comm, b777
Monday, 10:00, 1, Comm, a321
Monday, 12:00, 1, Comm, a321
Friday, 09:00, 1, Comm, a321
预期排序:
Monday, 10:00, 1, Comm, a321
Monday, 10:00, 1, Comm, b777
Monday, 12:00, 1, Comm, a321
Friday, 09:00, 1, Comm, a321
Sunday, 12:00, 1, Comm, b777
这可能吗?如果是,那么如何?
谢谢。
【问题讨论】:
【参考方案1】:是的,是的。
定义
bool Sales::operator<( const Sales& other ) // member
或
bool operator<( const Sales& lhs, const Sales& rhs) // global
并使用std::sort
。
只有两个 int
变量的示例,因为它们是最简单的:
bool operator<( const Sales& lhs, const Sales& rhs)
if( lhs.week < rhs.week )
return true;
else if( lhs.week > rhs.week )
return false;
if( lhs.price < rhs.price )
return true;
else if( lhs.price > rhs.price )
return false;
// ...
return false;
当然,你的定义会更复杂,因为其他字段比较复杂(例如工作日),但我希望你明白这一点。
然后:
#include <algorithm>
// ...
std::sort( list.begin(), list.end() );
顺便说一句,list
是变量的坏名称,因为在某些情况下它可能与 std::list
冲突。
【讨论】:
str::sort
如何知道以何种顺序使用哪些变量?
你在上面 Kiril 列出的函数体中定义它。
@ChrisL 我对此并不熟悉。你能给我举个例子吗?
这不是您所需要的,而是一个示例。如果您想按周排序,那么您将定义bool operator<( const Sales& lsh, const Sales& rhs) return (lhs.week < rhs.week);
//即如果周在左边小于右边返回true else false。 std::sort 使用此逻辑来订购您的容器
@kiril 对我来说看起来不错 - 省得我在评论中写它,我现在已经支持你的答案了。【参考方案2】:
如果你将实现布尔函数作为成员,它必须是 const 类型
bool operator<( const Sales& rhs) const
if (customer_name < rhs.customer_name ) return true;
if (category < rhs.category ) return true;
return false;
查看工作example
【讨论】:
为什么“必须”?也许“应该”? 直到我放上它才为我编译。 @BorisIvanov 这是我在编译test.cpp:73: error: a function-definition is not allowed here before ':' token
时得到的,因为 for loops
/usr/include/c++/4.8/bits/stl_algo.h:2269:19: 错误:将 'const Sales' 作为 'bool Sales::operator
以上是关于类自定义排序的 C++ 向量的主要内容,如果未能解决你的问题,请参考以下文章