C list :: sort的自定义比较函数
发布时间:2020-12-16 06:48:40 所属栏目:百科 来源:网络整理
导读:嗨,我在编译一段简单的代码时遇到了麻烦.我正在创建一个实现卡片组的类,我想使用list :: short方法创建一个shuffle方法. 相关代码: 加入deck.h #ifndef _DECK_H#define _DECK_H#include list#include ostream#include "Card.h"#include "RandomGenerator.h"
嗨,我在编译一段简单的代码时遇到了麻烦.我正在创建一个实现卡片组的类,我想使用list :: short方法创建一个shuffle方法.
相关代码: 加入deck.h #ifndef _DECK_H #define _DECK_H #include <list> #include <ostream> #include "Card.h" #include "RandomGenerator.h" using namespace std; class Deck { private: static const int CARD_NUMBER = Card::CARDS_PER_SUIT*Card::SUIT_NUMBER; list<Card *> *cards; RandomGenerator rg; public: Deck(); ~Deck(); void shuffle(); private: bool const compareRandom(const Card *a,const Card *b); }; #endif /* _DECK_H */ deck.cc: #include "Deck.h" /** * Fills the deck with a set of 52 cards */ Deck::Deck() { cards = new list<Card *>(); for(int i = 0; i < CARD_NUMBER; i++) cards->push_back( new Card( Card::Suit(int(i/Card::CARDS_PER_SUIT)),i%Card::CARDS_PER_SUIT) ); } Deck::~Deck() { gather(); for(list<Card *>::iterator c = cards->begin(); c != cards->end(); c++) delete *c; delete cards; } bool const Deck::compareRandom(const Card *a,const Card *b) { return rg.randomBool(); } void Deck::shuffle() { cards->sort(compareRandom); } 编译器显示下一条消息(忽略行号): Deck.cc: In member function ‘void Deck::shuffle()’: Deck.cc:66: error: no matching function for call to ‘std::list<Card*,std::allocator<Card*> >::sort(<unresolved overloaded function type>)’ /usr/include/c++/4.3/bits/list.tcc:303: note: candidates are: void std::list<_Tp,_Alloc>::sort() [with _Tp = Card*,_Alloc = std::allocator<Card*>] /usr/include/c++/4.3/bits/list.tcc:380: note: void std::list<_Tp,_Alloc>::sort(_StrictWeakOrdering) [with _StrictWeakOrdering = const bool (Deck::*)(const Card*,const Card*),_Tp = Card*,_Alloc = std::allocator<Card*>] 问题必须是我没有正确使用的compareRandom参考,我找不到谷歌搜索这个问题的答案. 提前致谢. 解决方法
我能说些什么 :)
首先,不要存储指向Card的指针,只需将卡直接存储在容器中.如果您因任何原因坚持存储指针,请使用shared_ptr< Card>来自Boost.其次,您可以使用std :: random_shuffle并将随机数生成器传递给它,而不是实现您的shuffle函数. 我可以再说一遍:) 这就是我的想法,除非你出于某种原因必须使用列表,尽管我没有看到这个原因. #include <iostream> #include <vector> #include <deque> #include <algorithm> class Card { // ... }; int main() { typedef std::vector<Card> Deck; Deck deck; // ... fill deck with cards. // There is an optional third parameter,// if you need to pass YOUR random-number-generator! // If you do,I recommend Boost implementation. std::random_shuffle(deck.begin(),deck.end()); } 我喜欢直接在C中处理容器,尽管你可能不喜欢它.另外,如果你看到std :: vector在你的情况下有性能问题,你可以用std :: deque替换typedef: typedef std::deque<Card> Deck; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |