multiset的使用

来源:互联网 发布:淘宝网红直播费用 编辑:程序博客网 时间:2024/06/06 01:37
使用环境VC2010

一. 简单使用

"代码1"

struct STItem{STItem();STItem(const STItem& stItem);~STItem();STItem(int nData);STItem& operator=(const STItem& stItem);void Release();int m_nData;};class CItemCmp{public:// 这个必须定义和实现bool operator()(const STItem& stItemA,const STItem& stItemA) const{// 在这个函数里面, 你喜欢怎样比较都行.return stItemA.m_nData < stItemA.m_nData;}};// CItemCmp很明显就是作为一个类似"函数对象"的角色typedef std::multiset<STItem, CItemCmp> STItemMultiset;typedef STItemMultiset::iterator STItemMultisetIterator;// 使用STItemMultiset itemMultset;itemMultset.insert(STItem(1));itemMultset.insert(STItem(2));itemMultset.insert(STItem(5));itemMultset.insert(STItem(8));itemMultset.insert(STItem(9));itemMultset.insert(STItem(6));itemMultset.insert(STItem(1));itemMultset.insert(STItem(4));itemMultset.insert(STItem(2));// itemMultset最终会得到排序// 按照STItem.m_nData的升序排列// 1, 1, 2, 2, 4, 5, 6, 8, 9



二. 遇到问题

上面例子中STItem是以对象形式存储在multiset容器中的, 如果STItem是一个比较大的对象的话, multiset内部的内存拷贝很频繁, 效率底下. 
解决方法很简单, 使用指针.

"代码2"

struct STItem{STItem();STItem(const STItem& stItem);~STItem();STItem(int nData);STItem& operator=(const STItem& stItem);void Release();int m_nData;};class CItemCmp{public:// 这里参数使用指针bool operator()(const STItem*& pSTItemA,const STItem*& pSTItemA) const{// 在这个函数里面, 你喜欢怎样比较都行.return pSTItemA->m_nData < pSTItemA->m_nData;}};// 这里需要改变typedef std::multiset<STItem*, CItemCmp> STItemMultiset;typedef STItemMultiset::iterator STItemMultisetIterator;// 使用STItemMultiset itemMultset;itemMultset.insert(new STItem(1));// 这里需要改变


但是这样修改, 编译没通过. (我个人的理解: 参照"代码1", 依葫芦画瓢, 得到的"代码2"应该是可行的, 但实际上编译报错了).
报错是 关于bool operator()(const STItem*& pSTItemA,const STItem*& pSTItemA) const 
中STItem* 不能转换为 const STItem*& 之类的.

可能是我自己在指针, 常量指针上的理解不透彻吧.


三. 走一点弯路来解决

"代码3"

struct STItem{STItem();STItem(const STItem& stItem);~STItem();STItem(int nData);STItem& operator=(const STItem& stItem);void Release();int m_nData;};// 增加这个中间类// 这个类里面管理STItem的指针, 在外面提供给CItemCmp类的operator()函数的参数作为引用使用.class CSTItem{public:CSTItem(STItem* pSTItem){m_pSTItem = pSTItem;}CSTItem(){m_pSTItem = 0;}CSTItem(const CSTItem& cSTItem){*this = cSTItem;}~CSTItem(){m_pSTItem = 0;}CSTItem& operator=(const CSTItem& cSTItem){m_pSTItem = cSTItem.m_pSTItem;return *this;}STItem* m_pSTItem;};class CItemCmp{public:// 这里参数使用指针bool operator()(const CSTItem& pCSTItemA,const STItem*& pCSTItemA) const{// 在这个函数里面, 你喜欢怎样比较都行.// 多了一层指针引用return pCSTItemA->m_pSTItem->m_nData < pSTItemCmpA->m_pSTItem->m_nData;}};// 这里需要改变typedef std::multiset<CSTItem, CItemCmp> CSTItemMultiset;typedef CSTItemMultiset::iterator CSTItemMultisetIterator;// 使用CSTItemMultiset itemMultset;itemMultset.insert(CSTItem(new STItem(1)));// 这里需要改变

路走弯了一点, 合适就好.


感觉"代码2"是可行的, 差一点点.
0 0
原创粉丝点击