Cocos2dx 엔진 노트 - 데이터 구조
'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::reverse
과 std::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
, double
과 bool
그리고 unsigned char,char*
, std::string
와 std::vector<Value>
.위 에서 언급 한 기본 클래스 를
std::unordered_map<std::string,Value>
대상 에 넣 고 해당 하 는 유형 으로 바 꿀 수 있 으 며, 반대로 도 마찬가지 입 니 다.std::unordered_map<int,Value>
밑바닥 은 하나의 통 일 된 변수 로 임의의 기본 형식 값 을 저장 하면 메모 리 를 더욱 절약 할 수 있다.메모: 기본 유형 과 용 기 를 처리 할 때 사용 하 십시오
cocos2d::Value
. cocos2d::Value
와 cocos2d::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::Value
, cocos2d::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/ 。
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.