Cocos2d-x3.0テンプレート容器詳細:cocos 2 d::Vector


1.概要
バージョン:v 3.0 beta
言語:C++
「COS 2 DX_ROOT/cococos/base」パスの下にある「CCVector.h」のヘッダファイルに定義します.
templateclass CC_DLL Vector; 

cococos 2 d::Vectorは
ダイナミックサイズの配列をカプセル化したシーケンス型コンテナ
.
 
その要素は
れんぞくきおく
の、cococos 2 d::Vectorのストレージは
じどうしょり
のです.内部データ構造の実装
実はSTL規格のシーケンシャルコンテナstd::vectorです.
 
Cocos 2 d-x v 3.0 betaの前に、もう一つの順序性容器cococos 2 d::CCArrayが存在し、これは廃棄される.
 
cococos 2 d::Vector容器をcococos 2 d::CCArrayの代替品として細かく設計していますので、cococos 2 d::Vectorをcocococococos 2 d::CCArrayの代替品として使用してください.
 
cococos 2 d::Vectorの一般的な操作の複雑さ(効率)は以下の通りである.
ランダムアクセス-定数0(1)
末尾に要素を挿入または除去-定数0(1)を割り当てます.
要素の挿入または除去-cocos 2 d::Vector長線形相関O(n)
 
2.テンプレートパラメータ
 
T-要素タイプ.
-Tはcocos 2 d::Objectサブクラスオブジェクトへのポインタである必要があります.
Cocos 2 d-xのメモリ管理モデルをcocos 2 d::Vectorに統合したため、他のデータ型またはオリジナル型ではありません(v 3.0 betaから).
 
3.メモリ管理
 
cococos 2 d::Vectorクラスには、一意のデータメンバーが含まれています.
std::vector _data; 

_dataのメモリ管理はコンパイラによって自動的に処理される.スタックにcocos 2 d::Vectorオブジェクトを宣言した場合は、メモリ解放の問題に関心を持つ必要はありません.
 
newオペレータを呼び出してcococos 2 d::Vectorのダイナミックメモリを割り当てる場合は、使用後にdeleteオペレータを呼び出してメモリを解放する必要があります.これはnew[]とdelete[]にも適用されます.
 
注:新しいC++では、スタックストレージオブジェクトではなくローカルストレージオブジェクトを格納する傾向があります.したがって、cococos 2 d::Vectorのスタックオブジェクトを割り当てるためにnewオペレータを呼び出さないで、スタックオブジェクトを使用して置き換えてください.
 
スタックにcococos 2 d::Vectorを動的に割り当てるのに十分な理由がある場合は、Shared_などの元のポインタをスマートポインタで置き換えてください.ptr,unique_ptr.
 
警告:cococos 2 d::Vectorはcococos 2 d::Objectのサブクラスではないため、他のcococos 2 dクラスのようにretain/releaseとメモリカウント管理は使用されません.言い換えれば、cocos 2 d::Vector自体にretain、releaseなどの操作を呼び出すことはできません.
 
4.基本的な使い方
 
統一されたインタフェースにCocos 2 d-xを加えたメモリ管理規則を用いてstd::vectorは基本的によく使われるすべての操作をカプセル化した.
 
したがって、pushBack()メソッドはこのパラメータの所有権をretainし、popBack()メソッドはreleaseコンテナの最後の要素の所有権をreleaseします.
 
これらの操作を使用する場合は、多くのCocos 2 d-x開発初心者にとって一般的なトラップである最下位のメモリ管理に注意する必要があります.
 
警告:cococos 2 d::Vectorはoperator[]をリロードしていないので、vecのような操作を使用してcococos 2 d::Vectorから要素を取得しようとすることはできません.
 
cococos 2 d::Vector容器は多くの異なる種類の反復器を提供している.C++標準ライブラリの標準インフラストラクチャから利益を得ました.例えば、大量の専用の標準汎用アルゴリズムとfor_eachサイクル.
 
std::vectorコンテナ操作に加えて、cococos 2 d::std::find、std::reverse、std::swapなどの多くの標準アルゴリズムを追加し、多くの有用で一般的な操作を簡略化しました.
 
より多くのAPIの使用は、エンジンソースコードとCocos 2 d-x 3.0 betaが実装したテスト例を参照してください.
 
簡単な例を示します.
//           Vector,            
auto sp0 = Sprite::create(); 
sp0->setTag(0); 
//     demo     shared_ptr,      ,          
std::shared_ptr>  vec0 = std::make_shared>();  //default constructor 
vec0->pushBack(sp0); 
  
//  capacity 5      Vector,            
auto sp1 = Sprite::create(); 
sp1->setTag(1); 
  
//           vector 
Vector  vec1(5); 
//                  
vec1.insert(0, sp1); 
  
//           vector 
vec1.pushBack(*vec0); 
  
for(auto sp : vec1) 
{ 
    log("sprite tag = %d", sp->getTag()); 
} 
  
Vector vec2(*vec0); 
if (vec0->equals(vec2)) { //     vector         
    log("pVec0 is equal to pVec2"); 
} 
if (!vec1.empty()) {  //   vector      
    //   vector   capacity   size,      capacity        size 
    if (vec1.capacity() == vec1.size()) { 
        log("pVec1->capacity()==pVec1->size()"); 
    }else{ 
        vec1.shrinkToFit();   //   vector              
        log("pVec1->capacity()==%zd; pVec1->size()==%zd",vec1.capacity(),vec1.size()); 
    } 
    //pVec1->swap(0, 1);  //       vector        
    vec1.swap(vec1.front(), vec1.back());  //      vector         
        if (vec2.contains(sp0)) {  //       ,             vector   
        log("The index of sp0 in pVec2 is %zd",vec2.getIndex(sp0)); 
    } 
    //  vector       
    vec1.erase(vec1.find(sp0)); 
    //pVec1->erase(1); 
    //pVec1->eraseObject(sp0,true); 
    //pVec1->popBack(); 
  
    vec1.clear(); //       
    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 

5.ベストプラクティス
 
スタックベースのcocos 2 d::スタックベースのcocos 2 d::VectorではなくVectorを使用する傾向があります.
 
cococos 2 d::Vectorを
パラメータを渡す
の場合、const cococos 2 d::Vector&などの通常の参照として宣言します.
 
1つの関数からcocos 2 d::Vectorを返すと、簡単に
戻り値オブジェクト
.コンパイラは、移動の意味を使用してこの状況を最適化します.
 
cococos 2 d::Vectorにcococos 2 d::Objectサブクラスオブジェクトポインタ以外の任意のデータ型オブジェクトを保存しようとしないでください.
 
翻訳:
https://github.com/chukong/cocos-docs/blob/master/manual/framework/native/data-structure/v3/vector/en.md
原帖住所:http://www.cocoachina.com/bbs/read.php?tid=199793