Cocos2dx 엔진 노트 - 데이터 구조

14536 단어
벡터
'COCOS2DX ROOT / cocos / base' 의 'CCVector. h' 헤더 파일 에 정의 합 니 다.
template<class T>class CC_DLL Vector;
Vector<T> 은 동적 성장 순서 로 접근 할 수 있 도록 봉 인 된 용기 이다.  cocos2d::Vector<T> 중의 요 소 는 순서대로 접근 하 는 것 이 고 그의 저층 실현 데이터 구 조 는 표준 모델 라 이브 러 리 의 표준 순서 용기 std::vector 이다.Cocos2d - x v 3.0 베타 이전에 다른 순서 로 용기 cocos2d::CCArray 에 접근 하지만 폐 기 됩 니 다.디자이너 들 은 cocos2d::Vector<T>cocos2d::CCArray 의 대체 품 으로 설계 했다.  cocos2d::Vector<T> 의 일부 작업 시간 복잡 도 는 다음 과 같다.
무 작위 접근, O (1) 요 소 를 끝부분 에 삽입 하거나 끝부분 의 요 소 를 삭제 합 니 다. O (1) 무 작위 삽입 또는 삭제, O (n) 모드 매개 변수
T -유형 은 cocos2d::Object 유형 을 계승 하 는 지침 이 어야 합 니 다.
메모리 관리cocos2d::Vector<T> 클래스 는 한 구성원 의 데이터 만 포함 합 니 다.
std::vector<T> _data;
vector<T>  _data 의 메모리 관 리 는 컴 파 일 러 가 자동 으로 처리 하 는 것 이 므 로 메모리 방출 에 신경 쓸 필요 가 없다. 
메모: 현대 c + + 를 사용 하면 로 컬 저장 대상 이 저장 대상 보다 좋 습 니 다.그 러 니 new 조작 으로 신청 cocos2d::Vector<T> 대상 을 하지 말고 스 택 대상 을 사용 하 세 요.진심으로 동적 분배 더미 cocos2d::Vector<T> 를 원한 다 면 원본 지침 을 스마트 지침 으로 덮어 주 십시오.
 경고: cocos2d::Vector<T>cocos2d::Object 의 하위 클래스 가 아니 므 로 다른 cocos2d 클래스 처럼 retain / release 와 인용 메모리 로 관리 하지 마 십시오.
기본 용법std::vector<T> 의 기본 조작 +  Cocos2d - x 의 메모리 관리 규칙. 
pushBack () 작업 은 전 달 된 인 자 를 유지 하고 popBack () 은 용기 의 마지막 요 소 를 방출 합 니 다.
경고: cocos2d::Vector<T> 다시 불 러 오기 [] 동작 이 없 기 때문에 아래 표 시 를 사용 하여 i 위 요 소 를 가 져 올 수 없습니다.  cocos2d::Vector<T> 서로 다른 유형의 교체 기 를 제공 하기 때문에 우 리 는 c + + 의 표준 함수 라 이브 러 리 에 도움 을 줄 수 있 습 니 다. 우 리 는 대량의 표준 범 형 알고리즘 과 for 를 사용 할 수 있 습 니 다.each 순환.std:: vector 용기 의 조작 을 제외 하고 개발 자 들 은 다음 과 같은 표준 알고리즘 도 많이 넣 었 습 니 다. std::find  std::reversestd::swap 이런 알고리즘 은 많은 통용 되 는 조작 을 간소화 할 수 있다. 
//create Vector<Sprite*> with default size and add a sprite into it
auto sp0 = Sprite::create();
sp0->setTag(0);
//here we use shared_ptr just as a demo. in your code, please use stack object instead
std::shared_ptr<Vector<Sprite*>>  vec0 = std::make_shared<Vector<Sprite*>>();  //default constructor
vec0->pushBack(sp0);

//create a Vector<Object*> with a capacity of 5 and add a sprite into it
auto sp1 = Sprite::create();
sp1->setTag(1);

//initialize a vector with a capacity
Vector<Sprite*>  vec1(5);
//insert a certain object at a certain index
vec1.insert(0, sp1);

//we can also add a whole vector
vec1.pushBack(*vec0);

for(auto sp : vec1)
{
    log("sprite tag = %d", sp->getTag());
}

Vector<Sprite*> vec2(*vec0);
if (vec0->equals(vec2)) { //returns true if the two vectors are equal
    log("pVec0 is equal to pVec2");
}
if (!vec1.empty()) {  //whether the Vector is empty
    //get the capacity and size of the Vector, noted that the capacity is not necessarily equal to the vector size.
    if (vec1.capacity() == vec1.size()) {
        log("pVec1->capacity()==pVec1->size()");
    }else{
        vec1.shrinkToFit();   //shrinks the vector so the memory footprint corresponds with the number of items
        log("pVec1->capacity()==%zd; pVec1->size()==%zd",vec1.capacity(),vec1.size());
    }
    //pVec1->swap(0, 1);  //swap two elements in Vector by their index
    vec1.swap(vec1.front(), vec1.back());  //swap two elements in Vector by their value
    if (vec2.contains(sp0)) {  //returns a Boolean value that indicates whether object is present in vector
        log("The index of sp0 in pVec2 is %zd",vec2.getIndex(sp0));
    }
    //remove the element from the Vector
    vec1.erase(vec1.find(sp0));
    //pVec1->erase(1);
    //pVec1->eraseObject(sp0,true);
    //pVec1->popBack();

    vec1.clear(); //remove all elements
    log("The size of pVec1 is %zd",vec1.size());
}

출력:
Cocos2d: sprite tag = 1
Cocos2d: sprite tag = 0
Cocos2d: pVec0 is equal to pVec2
Cocos2d: pVec1->capacity()==2; pVec1->size()==2
Cocos2d: The index of sp0 in pVec2 is 0
Cocos2d: The size of pVec1 is 0

최선 의 방법
스 택 기반 cocos2d::Vector<T> 을 고려 하여 쌓 기 기반 에 우선 사용 합 니 다.cocos2d::Vector<T> 를 매개 변수 로 전달 할 때 상수 참조 로 설명 합 니 다. const cocos2d::Vector<T>& 반환 값 은 cocos2d::Vector<T> 일 때 직접 값 을 되 돌려 주 는 경우 컴 파일 러 는 이동 작업 으로 최적화 된다.
cocos 2d:: Object 의 형식 을 계승 하지 않 은 데이터 형식 으로 사용 하지 마 십시오.
지도
'COCOS2DX ROOT / cocos / base' 의 'CCMap. h' 헤더 파일 에 정의 합 니 다.
template <class K, class V>
class CC_DLL Map;
cocos2d::Vector<T> 는 하부 구조 로 사용 되 는 연관 식 용기 다.cocos2d::Map<K,V> 는 키 값 을 저장 하 는 관련 용기 로 키 를 통 해 해당 하 는 값 을 빠르게 검색 할 수 있다.unordered_map, 키 는 보통 유일한 것 이 고 값 은 이 키 와 대응 합 니 다.
unordered 에서map 내부 에서 요 소 는 무질서 합 니 다. 키 의 해시 값 에 따라 접근 합 니 다. 액세스 시간 복잡 도 는 상수 이 고 매우 빠 릅 니 다.
Cocos2d - x v 3.0 베타 이전에 사용 한 것 은 다른 순서 용기 std::unordered_map 이지 만 곧 폐 기 될 것 이다.
디자이너 들 은 신중하게 std::unordered_map 대체 cocos2d::CCDictionary 를 설 계 했 기 때문에 가능 한 한 cocos2d::Map<K,V> 를 사용 해 야 한다 cocos2d::CCDictionary.
모드 매개 변수cocos2d::Map 클래스 는 하나의 데이터 구성원 만 포함 합 니 다.
typedef std::unordered_map<K, V> RefMap;
RefMap _data;
cocos2d::CCDictionary 의 메모리 관 리 는 컴 파일 러 에 의 해 처리 되 며, 스 택 에서 cocos2d::Map<K,V> 대상 을 설명 할 때 사용 하 는 메모리 방출 에 신경 쓰 지 않 아 도 됩 니 다.그러나 만약 당신 이 _data 조작 을 사용 하여 동적 분배 cocos2d::Map<K,V> 의 메모 리 를 사용한다 면 new 로 메모 리 를 방출 해 야 합 니 다. cocos2d::Map<K,V> 조작 도 마찬가지 입 니 다.
메모: 현대 c + + 를 사용 하면 로 컬 저장 대상 이 저장 대상 보다 좋 습 니 다.그 러 니 delete 작업 으로 new[] 쌓 인 대상 을 분배 하지 말고 스 택 대상 을 사용 하 세 요.
진심으로 동적 분배 더미 new 를 원한 다 면 원본 지침 을 스마트 지침 으로 덮어 주 십시오.
경고: cocos2d::Map<K,V>cocos2d::Map<K,V> 의 하위 클래스 가 아니 므 로 다른 cocos2d 클래스 처럼 retain / release 와 인용 메모리 로 관리 하지 마 십시오.
기본 용례
경고: cocos2d::Map<K,V> 작업 을 다시 불 러 오지 않 았 습 니 다. 아래 표 시 를 사용 하지 마 십시오. cocos2d::Object 대상 의 요 소 를 가 져 오지 마 십시오.
//create Map<K, V> with default size and add a sprite into it
auto sp0 = Sprite::create();
sp0->setTag(0);
Map<std::string, Sprite*> map0;
std::string mapKey0 = "MAP_KEY_0";
map0.insert(mapKey0, sp0);
log("The size of map is %zd.",map0.size()); 
//create a Map<K, V> with capacity equals 5
Map<std::string, Sprite*> map1(map0);
std::string mapKey1 = "MAP_KEY_1";
if(!map1.empty()){
    auto spTemp = (Sprite*)map1.at(mapKey0);
    log("sprite tag = %d", spTemp->getTag());
    auto sp1 = Sprite::create();
    sp1->setTag(1);
    map1.insert(mapKey1, sp1);      
    //get all keys,stored in std::vector, that matches the object
    std::vector<std::string> mapKeyVec;
    mapKeyVec = map1.keys();
    for(auto key : mapKeyVec)
    {
        auto spTag = map1.at(key)->getTag();
        log("The Sprite tag = %d, MAP key = %s",spTag,key.c_str());
        log("Element with key %s is located in bucket %zd",key.c_str(),map1.bucket(key));
    }
    log("%zd buckets in the Map container",map1.bucketCount());
    log("%zd element in bucket 1",map1.bucketSize(1));  
    //get a random object if the map isn't empty, otherwise it returns nullptr
    log("The random object tag = %d",map1.getRandomObject()->getTag());  
    //find(const K& key) can be used to search the container for an element with 'key'
    //erase(const_iterator position) remove an element with an iterator
    log("Before remove sp0, size of map is %zd.",map1.size());
    map1.erase(map1.find(mapKey0));
    log("After remove sp0, size of map is %zd.",map1.size());
}  
//create a Map<K, V> with capacity equals 5
Map<std::string, Sprite*> map2(5);
map2.reserve(10);  //set capacity of the map

결 과 는:
cocos2d: The size of map is 1.
cocos2d: sprite tag = 0
cocos2d: The Sprite tag = 1, MAP key = MAP_KEY_1
cocos2d: Element with key MAP_KEY_1 is located in bucket 1
cocos2d: The Sprite tag = 0, MAP key = MAP_KEY_0
cocos2d: Element with key MAP_KEY_0 is located in bucket 0
cocos2d: 2 buckets in the Map container
cocos2d: 1 element in bucket 1
cocos2d: The random object tag = 0
cocos2d: Before remove sp0, size of map is 2.
cocos2d: After remove sp0, size of map is 1.

최 적 용법cocos2d::Map<K,V> 를 매개 변수 로 전달 할 때 상수 참조 cocos2d::Map<K,V> 로 설명 합 니 다.
V 타 입 은 cocos2d::Map<K,V>() 의 하위 포인터 여야 하 며, 기본 타 입 을 다른 타 입 으로 포함 할 수 없습니다.
3. 가치
"COCOS2DX ROOT / cocos / base" 의 헤더 파일 인 "CCValue. h" 에 정의
class Value;
const cocos2d::Map<K,V>()& 는 많은 기본 유형의 포장 cocos2d::Object, cocos2d::Value, int, float, doublebool 그리고 unsigned char,char*std::stringstd::vector<Value>.
위 에서 언급 한 기본 클래스 를 std::unordered_map<std::string,Value> 대상 에 넣 고 해당 하 는 유형 으로 바 꿀 수 있 으 며, 반대로 도 마찬가지 입 니 다.std::unordered_map<int,Value> 밑바닥 은 하나의 통 일 된 변수 로 임의의 기본 형식 값 을 저장 하면 메모 리 를 더욱 절약 할 수 있다.
메모: 기본 유형 과 용 기 를 처리 할 때 사용 하 십시오 cocos2d::Valuecocos2d::Valuecocos2d::Vector<T>.
메모리 관리cocos2d::Map<K,V> 의 메모 리 는 석조 함수 에 의 해 방출 되 므 로 cocos2d::Value 을 사용 할 때 가능 한 한 추천 하 는 최선 의 방법 을 사용 하 십시오.cocos2d::Value 아래 의 데이터 구성원 을 포함 합 니 다.
union
{
    unsigned char byteVal;
    int intVal;
    float floatVal;
    double doubleVal;
    bool boolVal;
}_baseData;

std::string _strData;
ValueVector* _vectorData;
ValueMap* _mapData;
ValueMapIntKey* _intKeyMapData;

Type _type;

코드 세그먼트 중, cocos2d::Valuecocos2d::Value_baseData 는 컴 파일 러 와 그들의 석조 함수 가 메모리 방출 을 담당 하고 _strData 의 석조 함 수 는 포인터 구성원 _type 을 방출 한다.  cocos2d::Value_vectorData.
메모: _mapData 다른 cocos2d 형식 처럼 retain / release 와 refcount 메모리 관 리 를 사용 할 수 없습니다.
기본 용법intKeyMapData 의 용법 은 매우 간단 하고 직접적 이다.다음은 사용 하 는 예 입 니 다.
Value val;   // call the default constructor
if (val.isNull()) {
    log("val is null");
}else{
    std::string str =val.getDescription();
    log("The description of val0:%s",str.c_str());
}
//----------------------------------------------------
Value val1(65);   // initialize with a integer
//Value val1(3.4f);   // initialize with a float value
//Value val1(3.5);   // initialize with a double value
log("The description of the integer value:%s",val1.getDescription().c_str());
log("val1.asByte() = %c",val1.asByte());
//----------------------------------------------------
std::string strV = "string";
Value val2(strV);   // initialize with string
log("The description of the string value:%s",val2.getDescription().c_str());
//----------------------------------------------------
auto sp0 = Sprite::create();
Vector<Object*>* vecV = new Vector<Object*>();
vecV->pushBack(sp0);
Value val3(vecV);   // initialize with Vector
log("The description of the Vector value:%s",val3.getDescription().c_str());
delete vecV;
//----------------------------------------------------
Map<std::string, Object*>* mapV = new Map<std::string, Object*>();
mapV->insert(strV,sp0);
Value val4(mapV);   // initialize with Map
log("The description of the Map value:%s",val4.getDescription().c_str());
delete mapV;
//----------------------------------------------------
Value val6(&val4);   // initialize with Map
log("The description of the Value-type value:%s",val6.getDescription().c_str());
//----------------------------------------------------
val2 = val1;   // assigning between 2 Value-type
log("operator-> The description of val2:%s",val2.getDescription().c_str());
val2 = 4;   //assigning directly
log("operator-> The description of val4:%s",val2.getDescription().c_str());

결 과 는:
cocos2d: val is null
cocos2d: The description of the integer value:
65

cocos2d: val1.asByte() = A
cocos2d: The description of the string value:
string

cocos2d: The description of the Vector value:
true

cocos2d: The description of the Map value:
true

cocos2d: The description of the Value-type value:
true

cocos2d: operator-> The description of val2:
65

cocos2d: operator-> The description of val4:
4

최 적 용법
cocos 2d:: Value 와 새로운 모델 용기 (cocos 2d:: Vector 와 cocos 2d:: Map) 를 사용 하 는 것 이 cocos 2d:: CCBool, cocos 2d:: CCFloat, cocos 2d:: CCDouble, cocos 2d:: CCString, cocos 2d:: CCInteger 와 낡은 objective - c 스타일 의 용기 (cocos 2d:: CCArray 와 cocos 2d:: CCDictionary) 를 사용 하 는 것 보다 좋 습 니 다.
기본 유형의 취 합 을 사용 하려 면 기본 유형 을 cocos 2d: Value 로 포장 한 다음 모델 용기 cocos 2d:: Vector 와 cocos 2d:: Map 과 공동으로 사용 합 니 다.
  :    http://www.cocos.com/         。

좋은 웹페이지 즐겨찾기