Cocos 2 dx 3.0移行編(31)ValueVectorとVectorが言わざるを得ない物語

7874 ワード

本投票住所:http://vote.blog.csdn.net/Article/Details?articleid=37834689
ある日あなたは宇宙人に出会って、この时宇宙人はとても情热的にあなたを彼らの星に游びに招待して、あなたはどのように1を选びます:行って、しかしあなたは永远に帰ってこないかもしれません.
2:行かないで、しかし宇宙人はあなたの記憶を消します
この問題はとても刺激的です.
簡単そうに見える質問ですが、異なる答えには異なる意味が隠されています.
------------------
魚と熊の掌は兼ねることができなくて、このような例の生活の中でよく出会うことができます.同じように、Cocos 2 dx 3.0を理解したことがあるとしても、このような悩ましい状況に遭遇します.
それは次のことです.
ValueとVector(Map).
どうしてそう言うのですか.ゆっくり話してください.
-----------------
Cocos 2 dx 2.0バージョン番号では、
int型データを格納するには、どこに置くべきですか?はい、置いてください.
CCArrayでは、以下のようになります.
int i = 10;
CCArray _array = CCArray::create();//    CCArray  
_array->addObject(CCInteger::create(i));// int        
CCObjectオブジェクトを保存するとしたら、何で保存しますか?はい、また
CCArray:
CCSprite* sp = CCSprite::create("star.png");//      
...
_array->addObject(sp);//         

Cocos 2 dx 3.0バージョン番号では、
私たちはこのバージョン番号を知っています.
CCArrayはすでに振られています(実際には
__Arrayも代用できる)では、Ref(
3.0後にCCObjectがRefに名前を変更する)オブジェクトはどのように操作しますか?機知に富んだ私はすぐに思いついた.
CCArrayの代替:Vector、デモサンプルコードは以下のようになります.
auto sp = Sprite::create("star.png");
...
Vector<Sprite*> sp_vec;//    Sprite*     
sp_vec.pushBack(sp);//         

Vectorの操作にあまり詳しくないと仮定すると、前のブログを見ることができます:http://blog.csdn.net/star530/article/details/19170853
次に質問ですが、int型のようなデータ型を格納するとしたら、Vectorで実現できますか?答えは否定的で、Vectorの公式説明ドキュメントには次のような言葉があります.
cococos 2 d::VectorのTは、cococos 2 d::Refサブクラスオブジェクトを指すポインタである必要があります.Cocos 2 d-xのメモリ管理モデルをcocos 2 d::Vectorに統合したため、他のデータ型またはオリジナル型ではありません.
何という言葉があったっけ.
神様はあなたのためにドアを閉めて、きっとあなたのために窓を開けます...ここにはおじいさんを残さないで、自分でおじいさんを残す場所があります...Vectorがデータ型の要素を収容できない以上、それに代わるものがあるに違いありません.そう、
Value Vectorが歴史の舞台に登場した.
初めてValueVectorを見たとき、私は呆然としました.この品物は何のカップケーキですか.数秒後、私は反応して、この商品はValueとVectorの私生児に違いありません.私は本当に機知に富んでいます.このような抽象的な命名は私に答えを高速で考えることができて、心の中で思わず得意になりました.
まずCCValue.hヘッダファイルに声明を見てください.
typedef std::vector<Value> ValueVector;
から分かるように、
ValueVectorは実際にはValueタイプの要素を格納するstd::vector容器であり、ここでは私の以前の推測と少し違います.以下、幾つかのint型データをValue Vectorに格納する.
int a = 10;
int b = 20;
ValueVector val_vec;
val_vec.push_back(Value(a));
val_vec.push_back(Value(b));

上のコードは、2つのint型の変数を作成し、ValueVectorに入れることです.ValueVectorにはValue型の要素しか格納できないので、int型のa、b変数はValue型に変換してからValueVectorに入れる必要があります.
Valueの使い方については、以前のブログ:http://blog.csdn.net/star530/article/details/21651751を見ることができます.
------------------------------------------------------------------------------------------------------------
ValueVectorといえば、1、Plist(xml)プロファイルを読み込む簡単な操作です.たとえば、次のようになります.
ValueVector star_val = FileUtils::getInstance()->getValueVectorFromFile("star.plist");

ValueVectorが読み込んだplistファイルは、そのplistのフォーマットがarray配列タイプで始まるものに限られます.例えば、以下のようにします.
<array>
	<dict>
		<key>name</key>
		<string>star</string>
		<key>isCool</key>
		<string>yes</string>
	</dict>
</array>

dict辞書タイプで始まるファイルであると仮定すると、ValueMapと交換します.これは次の記事ですが、先にスキップします.
2、Value Vectorに要素を挿入します.前述したように、ValueVectorは実際にはValueタイプのvectorシーケンスコンテナを格納しているので、
エレメント挿入方式はvectorシーケンスコンテナの操作を直接使用できます.次のようにスケールします.
int a = 10;
std::string b = "star is so cool";
ValueVector star_val;
star_val.push_back( Value(a) );
star_val.push_back( Value(b) );//  ValueVector         Value  

3、Value Vectorの要素を抽出します.ここでは、上記の例について説明します.
int a1 = star_val.at(0).asInt();
std::string b1 = star_val.at(1).asString();
CCLOG("a1 = %d ,b1 = %s",a1,b1);
上のコード比較easy理解は、
抽出star_valに0と1の位置に置かれた要素をint型とstring型にそれぞれ変換します.asInt()とasString()は、Valueがタイプ変換を実現するために使用する関数です.4、Value Vectorの要素を削除します.コンテナでよく使用される要素の削除方法は、次の3つです.
1)コンテナの最後の要素を削除します.
star_val.pop_back();//             

2)eraseでコンテナの要素を削除しますか?どうして私は前に疑問符をつけますか?star_を削除するとしますvalの要素a、コードは以下のようになります.
auto star_iter = std::find(star_val.begin(),star_val.end(),a);
star_val.erase(star_iter);
の上の2行のコード情報量は比較的大きいです.まず、eraseが直接ではなく、反復器によって指向された単一の要素を削除したことを知っておく必要があります.
star_val.erase(a);
このような操作は間違っています.では、反復器とは何ですか.例を挙げます.
教室がvectorコンテナであり、学生一人一人がvectorの要素であり、学生の対応する座席番号が反復器であると仮定します.もし新しく来た先生eraseがいたら、彼女は授業中に隣の女子学生と眉をひそめて、先生は怒って、彼女はあなたをすぐに教室から出て行くつもりですが、彼女はあなたの名前を全然知らないので、彼女はただこのようにすることができます.
「3列目、5列目のあの小さな動作をする子供靴......指ささないで、あなたのことを言っているのに、どうして出て行ってくれたの?」
さあ、この麻辣女先生を忘れましょう.eraseのパラメータが反復器である必要があることを知っている以上、a要素に対応する反復器は何ですか.
ここでfindアルゴリズムを使用します.これは、aのコンテナ内の反復器を返します.(std::findの詳細な使い方ここ:点我!!)
最後に、
このような要素を削除する方法ではコンパイルに成功できないことを耻ずかしく言わざるを得ません!!!Valueには==演算子がリロードされていないため、std::findのデータ型は==演算子を実装しなければならないため、検索も削除もできません.
ここを見て誰かがテーブルを撮るに違いない:ニマ、この方法は削除できません.あなたはこんなにたくさん書いて何をしていますか.ズボンを脱いだらこれを見せてくれませんか?&......%*.
私の答えは:
ほほほ...私が当初このeraseを振り回してどれだけの时間を使ったことを知っていますか?間違いない!私は今社会に報復するリズムです!あなた达の楽しみを持っていないで私の心の中は痛快ではありません~!3)手に持っている憤慨したスイカナイフを収め、深く息を吸ってください.指定された要素を削除できない以上、私は缶を割って、すべての要素を削除することができますか?答えは肯定的です.
star_val.clear();

clearですべての要素を削除して、根源からあなたの生理的な悩みを解決します~
-----------------------------------------------------------------------------------------------------------------------
さて、ValueVectorの使い方はここまでですが、最後にまとめて補足します.1、VectorはRefタイプの要素を格納するだけで、データタイプの要素を格納することはできません.2、ValueVectorはValueタイプの要素を格納するためにしか使用できません.Valueはあくまでデータ型であるため、ValueVectorはデータ型を格納するためにしか使用できないと感じることができます.Refタイプの要素を入れないでください.そうしないと刺激的になります.3、ValueVectorにValueVectorを入れることができ、前提はValueVectorをValueタイプに変えることである.一方、VectorにはVectorタイプの要素を格納できません.たとえば、次のようになります.
ValueVector star_val;
ValueVector star_val2;
star_val.push_back( Value(star_val2) );//  

Vector< Vector<Ref*> > star_vec;//  !

OK、ここまでにしましょう.
----------------------------------------------------------------------------------------------------------------------
オリジナルを尊重し、転載は出所を明記してください:http://blog.csdn.net/star530/article/details/37834689
本文はCSDNブログ大会に参加して、もしあなたがこの編があなたに役に立つと思ったら、私に1票を投じてください!私は一生あなたに感謝します!投票先:
http://vote.blog.csdn.net/Article/Details?articleid=37834689(ページの一番下を引っ張って投票できます)