CCSet(内部std::set实现 成员std::set<CCObject *> *m_pSet count addObject containsObject begin anyObject)

来源:互联网 发布:淘宝快速冲销量的方法 编辑:程序博客网 时间:2024/05/01 22:37

#ifndef __CC_SET_H__

#define __CC_SET_H__


#include <set>

///////////////////////////

STL 对这个序列可以进行查找,插入删除序列中的任意一个元素,而完成这些操作的时间同这个序列中元素个数的对数成比例关系,并且当游标指向一个已删除的元素时,删除操作无效。而一个经过更正的和更加实际的定义应该是:一个集合(set)是一个容器,它其中所包含的元素的值是唯一的。这在收集一个数据的具体值的时候是有用的。集合中的元素按一定的顺序排列,并被作为集合中的实例。一个集合通过一个链表来组织,在插入操作和删除操作上比向量(vector)快,但查找或添加末尾的元素时会有些慢。具体实现采用了红黑树的平衡二叉树的数据结构

#include <set>
一个集合(set)是一个容器,它其中所包含的元素的值是唯一的。
集和多集的区别是:set支持唯一键值,set中的值都是特定的,而且只出现一次;而multiset中可以出现副本键,同一值可以出现多次。
如:set<int,less<int> > set1;
less<int>是一个标准类,用于形成升序排列函数对象。降序排列是用greater<int>。
set<int> set1;
for(int i=0; i<10; ++i)
set1.insert(i);
for(set<int>::iterator p=set1.begin();p!=set1.end();++p)
cout<<*p<<"";
if(set1.insert(3).second)//把3插入到set1中
//插入成功则set1.insert(3).second返回1,否则返回0
//此例中,集中已经有3这个元素了,所以插入将失败
cout<<"set insert success";
set是一种随机存储的关联式容器,其关键词(key)和元素(value)是同一个值。set之中所有元素互不相同。set是通过二叉查找树来实现的。

创建一个空的set

  1: set<int> s0 ;

创建一个带大于比较器的set, 默认是小于比较器less<int>

  1: set<int, greater<int>> s1 ;

自定义比较函数

以类为比较器

  1: struct classcmp
  2: {
  3:   bool operator()(const int& lhs, const int& rhs)
  4:   {
  5:     return lhs < rhs ;
  6:   }
  7: };
  8: 
  9: int main(void)
 10: {
 11:   set<int, classcmp> s5 ;
 12: 
 13:   system("pause") ;
 14:   return 0 ;
 15: }

以函数指针为比较器

  1: bool fncmp(int lhs, int rhs)
  2: {
  3:   return lhs < rhs ;
  4: }
  5: 
  6: int main(void)
  7: {
  8:   bool(*fn_pt)(int, int) = fncmp ;
  9:   set<int, bool(*)(int, int)> s1(fn_pt) ;
 10: 
 11:   system("pause") ;
 12:   return 0 ;
 13: }

由于set本身是有序的,所以不提供排序函数。

///////////////////////////

#include "CCObject.h"


NS_CC_BEGIN


typedef std::set<CCObject *>::iterator CCSetIterator;


class CC_DLL CCSet : public CCObject

{

public:

    CCSet(void);

    CCSet(const CCSet &rSetObject);

    virtual ~CCSet(void);


    static CCSet * create();

CCSet * CCSet::create()

{

    CCSet * pRet = new CCSet();

    

    if (pRet != NULL)

    {

        pRet->autorelease();

    }

    

    return pRet;

}


//Return a copy of the CCSet, it will copy all the elements.

    CCSet* copy();


    CCSet* mutableCopy();


    int count();//ccset 中元素个数


    void addObject(CCObject *pObject);//add into set. 会retain


    void removeObject(CCObject *pObject);//remove


    void removeAllObjects();//remove 所有元素


    bool containsObject(CCObject *pObject);//查看是否包含和参数相同的object

bool CCSet::containsObject(CCObject *pObject)

{

    return m_pSet->find(pObject) != m_pSet->end();

}


    CCSetIterator begin();//返回首元素迭代器


    CCSetIterator end();//返回末元素迭代器


    CCObject* anyObject();//返回首元素 如果没有返回null


    virtual void acceptVisitor(CCDataVisitor &visitor);

void CCSet::acceptVisitor(CCDataVisitor &visitor)

{

    visitor.visit(this);

}




private:

    std::set<CCObject *> *m_pSet; //std::set

};



NS_CC_END


#endif // __CC_SET_H__


0 0
原创粉丝点击