关键词:
【中文标题】按成员降序对多个对象进行排序?【英文标题】:Sorting Multiple Objects By Member in Descending Order? 【发布时间】:2013-05-31 12:23:14 【问题描述】:我看过以下问题:按对象的属性对对象向量进行排序
这似乎与我的情况非常相关。我有少量 Player 对象(6-10 个),它们都有诸如名称和一些相关统计信息之类的信息。我想按一个特定的统计数据按降序对它们进行排序。
仍然很困惑
请帮忙!
编辑:下面是完整更新的代码
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
using namespace std;
class Player
public:
Player(string name, int Dex, int Mod, int Lvl, int& diceRoll);
int calcInitiative(int& diceRoll);
int diceRoll;
friend ostream& operator<<(ostream& out, const Player& player)
return out << player.mName << " " << player.mInitiative;
bool operator<(const Player& rhs) const
if(mInitiative < rhs.mInitiative) return true;
if(mInitiative > rhs.mInitiative) return false;
if(mInitiative == rhs.mInitiative) return false;
int mDex, mMod, mLvl, mInitiative;
string mName;
;
Player::Player(string name, int Dex, int Mod, int Lvl, int& diceRoll)
: mName(name), mDex(Dex), mMod(Mod), mLvl(Lvl)
int Player::calcInitiative(int& diceRoll)
return (mLvl/2) + mDex + mMod + diceRoll;
int main()
int rollD, rollS; // etc.
vector<Player> playerVec;
cout << "Derek rolled: ";
cin >> rollD;
cout << '\n' << "Scott rolled: ";
cin >> rollS;
// etc.
Player Derek("Derek", 2, 0, 6, rollD);
Player B("B", 2, 0, 9, rollB);
// etc...
Derek.mInitiative = Derek.calcInitiative(rollD);
Scott.mInitiative = Scott.calcInitiative(rollS);
//etc.
playerVec.push_back(Derek);
playerVec.push_back(Scott);
// etc.
cout << "The initative order is: " << '\n';
sort (playerVec.begin(), playerVec.end());
for(vector<Player>::iterator it = playerVec.begin(); it != playerVec.end(); ++it)
cout << *it << endl;
system("pause");
return 0;
【问题讨论】:
如果您只想按一种属性组合进行排序,只需重载 std::sort 使用 Quicksort 算法进行排序 重载 @Rome_Leader:正如在那个问题中所澄清的那样,operator<
与您对cout
陈述的困难没有任何关系。
它一直中断我的解释,但基本上,仍然在努力弄清楚 operator
【参考方案1】:
您几乎已经编写了所有代码。
在您的 Player 类中,添加以下函数:
bool operator<(const Player& rhs) const;
如果this
小于右侧,则使其返回true。类似于您的上一个代码块。
现在运行:
sort(myVec.begin(), myVec.end());
这将进行就地排序。
编辑:这是一个完全可编译的示例,展示了它们如何协同工作:
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
class Player
public:
Player(int stat1, int stat2) : m_stat1(stat1), m_stat2(stat2)
bool operator<(const Player& rhs) const
if(m_stat1 < rhs.m_stat1) return true;
if(m_stat1 > rhs.m_stat1) return false;
return m_stat2 < rhs.m_stat2;
friend ostream& operator<<(ostream& out, const Player& player)
return out << player.m_stat1 << ", " << player.m_stat2;
private:
int m_stat1, m_stat2;
;
int main()
vector<Player> aPlayers;
aPlayers.push_back(Player( 1, 2 ));
aPlayers.push_back(Player( 1, 1 ));
aPlayers.push_back(Player( 5, 0 ));
std::sort(aPlayers.begin(), aPlayers.end());
for(vector<Player>::iterator it = aPlayers.begin();
it != aPlayers.end(); ++it)
cout << *it << endl;
输出:
1, 1
1, 2
5, 0
我把 operator
编辑 2:在您的新代码中,您提到编译器给您一个错误。该错误很可能是因为无法确定代码是否会返回值。如果您将return false
添加到operator<
的末尾,它将停止给您一个错误。这也会使您的operator<
中的第三行变得多余。
就结果的倒序而言,sort
默认按升序排序。有几个非常简单的方法可以解决这个问题。最明显的是重写operator<
以生成您喜欢的排序。一个更通用的选择是将反向迭代器提供给 std::sort 而不是默认的迭代器:
std::sort(aPlayers.rbegin(), aPlayers.rend());
rbegin()
和 rend()
就像 begin()
和 end()
一样,只是它们相反。
【讨论】:
啊,我明白了!所以这个重载,连同我的另一个重载,将阻止在元素已经处于正确顺序的情况下切换! 您不需要任何其他重载,只需operator<
。 std::sort 将自动为您完成其余的工作;每当它发现两个无序的元素时,它就会对这两个元素调用 std::swap ,最终得到一个有序的向量。
仍有一些困难。由于过载,cout 的双尖括号 (
@Rome_Leader:问题中的示例是否澄清了您的困惑?
我肯定会到达那里。很有帮助。不过,我对
【参考方案2】:
通过使用提供的谓词(在您的情况下这是一个函子)对向量调用 std::sort,您已经在交换您的玩家。
在您的示例中,在 myVec 上调用 sort 后,您将拥有 Player 的向量,或者任何 T 按属性 x 降序排序。
所以我看不出手动切换/交换任何东西的目的。
【讨论】:
所以你认为像上面这样的排序调用,按 Player 的属性 .stat 排序会切换对象本身吗?如果是这样,那将非常有用。然后我可以简单地将它们的 .stat 值按顺序输出给用户。 这正是排序的用途。正如 Rick 指出的那样,在 Player 类中用 operator 啊,好的。对不起我的困惑。我现在无法测试,但我认为它应该会成功,并且比我之前的尝试有了很大的改进。如何按升序和降序对列进行排序?
】如何按升序和降序对列进行排序?【英文标题】:howsortcolumnsinascendinganddescendingorder?【发布时间】:2020-11-0902:46:18【问题描述】:我使用对象数组创建了表,现在我不明白我们如何通过单击reactjs中的列名按升序和降序对表进行... 查看详情
按降序对对象数组进行排序[关闭]
】按降序对对象数组进行排序[关闭]【英文标题】:sortarrayofobjectsindescendingorder[closed]【发布时间】:2012-12-0900:20:21【问题描述】:我正在使用定义的“newsFeed”对象的堆数组来实现优先级队列,这些对象都有一个字符串、一个“... 查看详情
如何按降序对列表视图项进行排序
】如何按降序对列表视图项进行排序【英文标题】:Howtosortlistviewitemsindescendingorder【发布时间】:2013-08-1319:04:38【问题描述】:所以我有一个列表视图,我想在其中按降序对NumberOfRecords进行排序。我有一个自定义数组适配器,但... 查看详情
如何按降序对列表进行排序
】如何按降序对列表进行排序【英文标题】:Howtosortthelistbydescendingorder【发布时间】:2022-01-0605:54:27【问题描述】:publicclassItemspublicstringNameget;set;publicintIdget;set;publicList<string>SubItemsget;set;上面是我的课。在我的代码中的某处... 查看详情
如何按降序对 ListView.builder 进行排序?
】如何按降序对ListView.builder进行排序?【英文标题】:HowtosortListView.builderindecreasingorder?【发布时间】:2021-07-2607:54:02【问题描述】:我想按降序排列View.builder你能帮我吗?ListView.builder(itemCount:..,itemBuilder:(BuildContextcontext,inti)..)... 查看详情
按降序对数组进行排序的更好方法
】按降序对数组进行排序的更好方法【英文标题】:Betterwaytosortarrayindescendingorder【发布时间】:2011-07-2217:58:09【问题描述】:我有一个int数组,我必须按降序排序。由于我没有找到任何按降序对数组进行排序的方法。目前我正... 查看详情
如何按降序对 JSON 数组元素进行排序? [复制]
】如何按降序对JSON数组元素进行排序?[复制]【英文标题】:HowtosortJSONarrayelementsindescendingorder?[duplicate]【发布时间】:2019-06-0616:42:53【问题描述】:在我的index.html中,我按以下顺序从服务器接收数据:[id:1,keyOne:valueOne,keyTwo:value... 查看详情
如何按日期降序对数据表进行排序
】如何按日期降序对数据表进行排序【英文标题】:Howtosortdatatableswithdateindescendingorder【发布时间】:2016-10-1507:33:02【问题描述】:我希望使用数据表显示记录,默认排序基于我的行之一,日期和时间按降序排列。请帮助我为此... 查看详情
按特定索引降序对数组进行排序[重复]
】按特定索引降序对数组进行排序[重复]【英文标题】:Sortinganarrayofarraysbyspecificindexdescending[duplicate]【发布时间】:2018-05-2616:12:29【问题描述】:我有下面的数组Array([Prod1]=>Array([0]=>$1,167,788.03[1]=>26,872[2]=>73.42[3]=>19.0%[4... 查看详情
按升序或降序对数字或字母进行通用排序
】按升序或降序对数字或字母进行通用排序【英文标题】:GenericSortforNumberorAlphabetinAscendingorDescendingOrder【发布时间】:2019-07-1716:55:32【问题描述】:如何对只能包含字母或数字的通用数组进行排序?假设我有一个仅包含数字的... 查看详情
如何在 Reactjs 中按升序或降序对数据进行排序?
】如何在Reactjs中按升序或降序对数据进行排序?【英文标题】:HowtosortdatainascendingordescendingorderinReactjs?【发布时间】:2018-10-0915:02:12【问题描述】:我在我的显示组件中导入了产品数据。对于JSON中的每个产品,我使用.map()来显... 查看详情
按特定键的降序对字典列表进行排序[重复]
】按特定键的降序对字典列表进行排序[重复]【英文标题】:Sortingthelistofdictionariesindescendingorderofaparticularkey[duplicate]【发布时间】:2017-02-2806:05:44【问题描述】:我有一个python字典列表,例如[\'a\':3,\'b\':4,\'c\':5,\'d\':\'6\',\'a\':1,\'b\... 查看详情
如果JS中存在值,如何根据日期按降序对数组进行排序?
】如果JS中存在值,如何根据日期按降序对数组进行排序?【英文标题】:HowtosortarraybasedondateindescendingorderifvalueexistsinJS?【发布时间】:2020-04-1217:43:45【问题描述】:我正在尝试根据publishDate的降序对数据进行排序,但它不起作... 查看详情
如何按降序对 ArrayList<Long> 进行排序?
】如何按降序对ArrayList<Long>进行排序?【英文标题】:HowtosortArrayList<Long>indecreasingorder?【发布时间】:2011-08-1904:26:20【问题描述】:如何在Java中对ArrayList<Long>进行降序排序?【问题讨论】:【参考方案1】:... 查看详情
Firebase 按降序对数据进行排序。 (只排序了一半。)
】Firebase按降序对数据进行排序。(只排序了一半。)【英文标题】:Firebasesortingdataindescendingorder.(onlyhalfsorted.)【发布时间】:2018-05-2101:47:16【问题描述】:我正在尝试按值将我的列表视图排序为降序。我试过使用Collections.reverse... 查看详情
按降序对单链表进行排序
】按降序对单链表进行排序【英文标题】:SortSingleLinkedListindescendingorder【发布时间】:2016-10-1619:57:23【问题描述】:如何按分数降序显示此链接列表?当我在我的GUI中显示它以按顶部的最高分排序,然后降到底部的最低分时,... 查看详情
如何按日期降序对 NSDate 进行排序,但在该日期内时间升序?
】如何按日期降序对NSDate进行排序,但在该日期内时间升序?【英文标题】:HowtosortNSDatebydatedescending,butwithtimeascendingwithinthatdate?【发布时间】:2012-07-1907:30:33【问题描述】:我使用NSFetchedResultsController和NSSortDescriptor成功排序到... 查看详情
按 C 中元素出现频率的降序对数组进行排序
】按C中元素出现频率的降序对数组进行排序【英文标题】:SortthearrayindecreasingorderoffrequencyofoccurrenceofelementsinC【发布时间】:2013-10-0810:13:44【问题描述】:问题是根据元素出现的频率对数组进行排序。例如,如果输入数组是2,3,2,... 查看详情