ホームページ データベース mysql チュートリアル Cocos2d-x3.0中容器介绍(cocos2d::Vector)

Cocos2d-x3.0中容器介绍(cocos2d::Vector)

Jun 07, 2016 pm 02:59 PM
導入 容器

v3.0加入 定义在”COCOS2DX_ROOT/cocos/base”的”CCVector.h”头文件中。 templateclass CC_DLL Vector; cocos2d::Vector是一个封装好的能动态增长顺序访问的容器。 cocos2d::Vector中的元素是按序存取的,它的低层实现数据结构是标准模版库中的标准顺序容

 

  • v3.0加入

定义在”COCOS2DX_ROOT/cocos/base”的”CCVector.h”头文件中。


templateclass CC_DLL Vector;


cocos2d::Vector是一个封装好的能动态增长顺序访问的容器。

cocos2d::Vector中的元素是按序存取的,它的低层实现数据结构是标准模版库中的标准顺序容器std::vector。

在cocos2d-x v3.0 beta之前,使用的是另外一个顺序访问容器cocos2d::CCArray,不过它将会被废弃。

设计者们将cocos2d::Vector设计为cocos2d::CCArray的替代品,所以建议优先考虑使用cocos2d::Vector。

cocos2d::Vector的一些操作的时间复杂度如下:

  • 随机访问,O(1)
  • 将元素插入到尾部或者删除尾部的元素,O(1)
  • 随机插入或删除, O(n)

模版参数

T – 元素类型

  • T的类型必须是继承自cocos2d::Ref类型的指针。因为已经将cocos2d-x的内存管理模型集成到了cocos2d::Vector中,所以类型参数不能是其他的类型包括基本类型。

内存管理

cocos2d::Vector类只包含一个成员数据:

<span>std</span><span>::</span><span>vector</span><span><span>T</span><span>></span><span> _data</span><span>;</span></span>
ログイン後にコピー

_data的内存管理是由编译器自动处理的,如果声明了一个cocos2d::Vector类型,就不必费心去释放内存。

注意:使用现代的c++,本地存储对象比堆存储对象好。所以请不要用new操作来申请cocos2d::Vector的堆对象,请使用栈对象。

如果真心想动态分配堆cocos2d::Vector,请将原始指针用智能指针来覆盖。

警告:cocos2d::Vector并不是cocos2d::Ref的子类,所以不要像使用其他cocos2d类一样来用retain/release和引用计数内存管理。

基本用法

作者们用std::vector的基本操作加上cocos2d-x的内存管理规则来覆盖该模版原先的普通操作。

所以pushBack()操作将会保留传递过来的参数,而popBack()则会释放掉容器中最后的一个元素。

当你使用这些操作的时候,你需要特别注意这些受托管的对象,对于新手来说,这往往是陷阱。

警告:cocos2d::Vector并没有重载[]操作,所以不能直接用下标[i]来获取第i位元素。

cocos2d::Vector提供了不同类型的迭代器,所以我们可以受益于c++的标准函数库,我们可以使用大量标准泛型算法和for_each循环。

除了std::vector容器的操作之外,开发者们还加入许多标准算法诸如:std::find, std::reverse和std::swap,这些算法可以简化很多通用的操作。

要了解更多的api用例,可以参考cocos2d-x 3.0的源码和压缩包里附带的例子。

下面是一些简单的例子:

<span>//create Vector<sprite> with default size and add a sprite into it</sprite></span><span>auto</span><span> sp0 </span><span>=</span><span>Sprite</span><span>::</span><span>create</span><span>();</span><span>
sp0</span><span>-></span><span>setTag</span><span>(</span><span>0</span><span>);</span><span>//here we use shared_ptr just as a demo. in your code, please use stack object instead</span><span>
std</span><span>::</span><span>shared_ptr</span><span><span>Vector</span><span><span>Sprite</span><span>*>></span><span>  vec0 </span><span>=</span><span> std</span><span>::</span><span>make_shared</span><span><span>Vector</span><span><span>Sprite</span><span>*>>();</span><span>//default constructor</span><span>
vec0</span><span>-></span><span>pushBack</span><span>(</span><span>sp0</span><span>);</span><span>//create a Vector<ref> with a capacity of 5 and add a sprite into it</ref></span><span>auto</span><span> sp1 </span><span>=</span><span>Sprite</span><span>::</span><span>create</span><span>();</span><span>
sp1</span><span>-></span><span>setTag</span><span>(</span><span>1</span><span>);</span><span>//initialize a vector with a capacity</span><span>Vector</span><span><span>Sprite</span><span>*></span><span>  vec1</span><span>(</span><span>5</span><span>);</span><span>//insert a certain object at a certain index</span><span>
vec1</span><span>.</span><span>insert</span><span>(</span><span>0</span><span>,</span><span> sp1</span><span>);</span><span>//we can also add a whole vector</span><span>
vec1</span><span>.</span><span>pushBack</span><span>(*</span><span>vec0</span><span>);</span><span>for</span><span>(</span><span>auto</span><span> sp </span><span>:</span><span> vec1</span><span>)</span><span>{</span><span>
    log</span><span>(</span><span>"sprite tag = %d"</span><span>,</span><span> sp</span><span>-></span><span>getTag</span><span>());</span><span>}</span><span>Vector</span><span><span>Sprite</span><span>*></span><span> vec2</span><span>(*</span><span>vec0</span><span>);</span><span>if</span><span>(</span><span>vec0</span><span>-></span><span>equals</span><span>(</span><span>vec2</span><span>))</span><span>{</span><span>//returns true if the two vectors are equal</span><span>
    log</span><span>(</span><span>"pVec0 is equal to pVec2"</span><span>);</span><span>}</span><span>if</span><span>(!</span><span>vec1</span><span>.</span><span>empty</span><span>())</span><span>{</span><span>//whether the Vector is empty</span><span>//get the capacity and size of the Vector, noted that the capacity is not necessarily equal to the vector size.</span><span>if</span><span>(</span><span>vec1</span><span>.</span><span>capacity</span><span>()</span><span>==</span><span> vec1</span><span>.</span><span>size</span><span>())</span><span>{</span><span>
        log</span><span>(</span><span>"pVec1->capacity()==pVec1->size()"</span><span>);</span><span>}</span><span>else</span><span>{</span><span>
        vec1</span><span>.</span><span>shrinkToFit</span><span>();</span><span>//shrinks the vector so the memory footprint corresponds with the number of items</span><span>
        log</span><span>(</span><span>"pVec1->capacity()==%zd; pVec1->size()==%zd"</span><span>,</span><span>vec1</span><span>.</span><span>capacity</span><span>(),</span><span>vec1</span><span>.</span><span>size</span><span>());</span><span>}</span><span>//pVec1->swap(0, 1);  //swap two elements in Vector by their index</span><span>
    vec1</span><span>.</span><span>swap</span><span>(</span><span>vec1</span><span>.</span><span>front</span><span>(),</span><span> vec1</span><span>.</span><span>back</span><span>());</span><span>//swap two elements in Vector by their value</span><span>if</span><span>(</span><span>vec2</span><span>.</span><span>contains</span><span>(</span><span>sp0</span><span>))</span><span>{</span><span>//returns a Boolean value that indicates whether object is present in vector</span><span>
        log</span><span>(</span><span>"The index of sp0 in pVec2 is %zd"</span><span>,</span><span>vec2</span><span>.</span><span>getIndex</span><span>(</span><span>sp0</span><span>));</span><span>}</span><span>//remove the element from the Vector</span><span>
    vec1</span><span>.</span><span>erase</span><span>(</span><span>vec1</span><span>.</span><span>find</span><span>(</span><span>sp0</span><span>));</span><span>//pVec1->erase(1);</span><span>//pVec1->eraseObject(sp0,true);</span><span>//pVec1->popBack();</span><span>

vec1</span><span>.</span><span>clear</span><span>();</span><span>//remove all elements</span><span>
log</span><span>(</span><span>"The size of pVec1 is %zd"</span><span>,</span><span>vec1</span><span>.</span><span>size</span><span>());</span><span>}</span></span></span></span></span></span></span>
ログイン後にコピー

输出:

<span>Cocos2d</span><span>:</span><span> sprite tag </span><span>=</span><span>1</span><span>Cocos2d</span><span>:</span><span> sprite tag </span><span>=</span><span>0</span><span>Cocos2d</span><span>:</span><span> pVec0 </span><span>is</span><span> equal to pVec2
</span><span>Cocos2d</span><span>:</span><span> pVec1</span><span>-></span><span>capacity</span><span>()==</span><span>2</span><span>;</span><span> pVec1</span><span>-></span><span>size</span><span>()==</span><span>2</span><span>Cocos2d</span><span>:</span><span>The</span><span> index of sp0 </span><span>in</span><span> pVec2 </span><span>is</span><span>0</span><span>Cocos2d</span><span>:</span><span>The</span><span> size of pVec1 </span><span>is</span><span>0</span>
ログイン後にコピー

推荐做法

  • 考虑基于栈的cocos2d::Vector优先用于基于堆的
  • 当将cocos2d::Vector作为参数传递时,将它声明成常量引用:const cocos2d::Vector&
  • 返回值是cocos2d::Vector时,直接返回值,这种情况下编译器会优化成移动操作。
  • 不要用任何没有继承cocos2d::Ref的类型作为cocos2d::Vector的数据类型。
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

wapiとは何かを詳しく紹介 wapiとは何かを詳しく紹介 Jan 07, 2024 pm 09:14 PM

インターネットを利用する際に「wapi」という言葉を目にしたことはあるかもしれませんが、「wapi」が何なのかよく分からないという方もいると思いますので、以下で詳しくご紹介します。 wapi とは: 回答: wapi は、無線 LAN の認証と機密性を確保するためのインフラストラクチャです。一般的にオフィスビルなどの近くでカバーされる赤外線やBluetoothなどの機能と似ています。基本的にこれらは小さな部門によって所有されているため、この機能の範囲はわずか数キロメートルです。 wapi の関連紹介: 1. Wapi は無線 LAN の伝送プロトコルです。 2. この技術により、狭帯域通信の問題を回避し、より良好な通信が可能になります。 3. 信号の送信に必要なコードは 1 つだけです

win11でPUBGゲームが実行できるか詳しく解説 win11でPUBGゲームが実行できるか詳しく解説 Jan 06, 2024 pm 07:17 PM

PlayerUnknown's Battlegrounds としても知られる Pubg は、2016 年の人気以来、多くのプレイヤーを魅了してきた非常に古典的なシューティング バトル ロイヤル ゲームです。最近win11システムがリリースされた後、多くのプレイヤーがwin11でpubgをプレイしたいと考えています。編集者に従ってwin11でpubgをプレイできるかどうかを確認してみましょう。 win11 で pubg をプレイできますか? 回答: Win11 で pubg をプレイできます。 1. win11の開始当初、win11ではtpmを有効にする必要があったため、多くのプレイヤーがpubgから追放されました。 2. しかし、プレイヤーのフィードバックに基づいて、Blue Hole はこの問題を解決し、win11 で pubg を正常にプレイできるようになりました。 3.居酒屋に出会ったら

Python 関数入門: exec 関数の概要と例 Python 関数入門: exec 関数の概要と例 Nov 03, 2023 pm 02:09 PM

Python 関数の紹介: exec 関数の概要と例 はじめに: Python では、exec は、文字列またはファイルに格納されている Python コードを実行するために使用される組み込み関数です。 exec 関数はコードを動的に実行する方法を提供し、プログラムが実行時に必要に応じてコードを生成、変更、実行できるようにします。この記事では、exec 関数の使い方と実用的なコード例を紹介します。 exec 関数の使用方法: exec 関数の基本的な構文は次のとおりです。

i5プロセッサがwin11をインストールできるかどうかの詳細な紹介 i5プロセッサがwin11をインストールできるかどうかの詳細な紹介 Dec 27, 2023 pm 05:03 PM

i5 は Intel が所有するプロセッサのシリーズで、第 11 世代 i5 にはさまざまなバージョンがあり、世代ごとに性能が異なります。したがって、i5 プロセッサーが win11 をインストールできるかどうかは、プロセッサーの世代によって異なりますので、エディターに従って個別に学習しましょう。 i5 プロセッサーは win11 にインストールできますか: 回答: i5 プロセッサーは win11 にインストールできます。 1. 第 8 世代以降の i51、第 8 世代以降の i5 プロセッサは、Microsoft の最小構成要件を満たすことができます。 2. したがって、Microsoft Web サイトにアクセスして「Win11 インストール アシスタント」をダウンロードするだけで済みます。 3. ダウンロードが完了したら、インストール アシスタントを実行し、プロンプトに従って Win11 をインストールします。 2. i51 8世代以前と8世代以降

Docker を使用してコンテナ障害の回復と自動再起動を行う方法 Docker を使用してコンテナ障害の回復と自動再起動を行う方法 Nov 07, 2023 pm 04:28 PM

Docker は、コンテナー テクノロジーに基づく軽量の仮想化プラットフォームとして、さまざまなシナリオで広く使用されています。実稼働環境では、コンテナの高可用性と自動障害回復が非常に重要です。この記事では、Docker を使用してコンテナ障害の回復と自動再起動を行う方法を、具体的なコード例を含めて紹介します。 1. コンテナ自動再起動の設定 Docker では、コンテナ実行時に --restart オプションを使用することでコンテナの自動再起動機能を有効にすることができます。一般的なオプションは次のとおりです。 no: 自動的に再起動しません。静けさ

CMD 経由で Wi​​ndows 10 または 11 に Redhat Podman をインストールする方法 CMD 経由で Wi​​ndows 10 または 11 に Redhat Podman をインストールする方法 Oct 02, 2023 pm 09:33 PM

Windows 11 または 10 に RedHatPodman をインストールする 以下の手順に従って、コマンド プロンプトまたは Powershell を使用して Windows マシンに RedHatPodman をインストールします。 ステップ 1: システム要件を確認する まず、Windows システムが最新のアップデートで実行されていることを確認する必要があります。 Podman の要件を実行するための要件を満たすことができます。 Windows 11 または Windows 10 バージョン 1709 (ビルド 16299) 以降を使用する必要があり、Windows Subsystem for Linux 2 (WSL2) と VM 機能を有効にする必要があります。まだアクティブ化されていない場合は、次の 2 段階のコマンドを使用できます。これを実行します

ファーウェイ、Inspur、その他の部門が共同で設立したオープンソースのコンテナミラーリングセンターであるAtomHubは、正式に公開テストを開始し、国内サービスを安定してダウンロードできると発表した。 ファーウェイ、Inspur、その他の部門が共同で設立したオープンソースのコンテナミラーリングセンターであるAtomHubは、正式に公開テストを開始し、国内サービスを安定してダウンロードできると発表した。 Jan 02, 2024 pm 03:54 PM

ファーウェイの公式ニュースによると、「開発者のためのすべて」をテーマとしたオープン・アトミック・デベロッパー・カンファレンスが12月16日から17日までの2日間、無錫で開催された。このカンファレンスは、オープン・アトミック・オープンソース財団、ファーウェイ、 Inspur.、DaoCloud、Xieyun、Qingyun、Hurricane Engine、OpenSDV Open Source Alliance、openEuler コミュニティ、OpenCloudOS コミュニティ、その他のメンバー ユニットが共同で AtomHub Trusted Mirror Center の構築を開始し、正式に公開テストが開始されました。 AtomHub は、共同構築、共同ガバナンス、共有の概念を遵守し、オープンソース組織と開発者に中立的でオープンで共同構築された信頼できるオープンソース コンテナ ミラー センターを提供することを目指しています。 DockerHub などのイメージ ウェアハウスの不安定性と制御不能性を考慮して、

最新のWin11サウンドチューニング方法を紹介 最新のWin11サウンドチューニング方法を紹介 Jan 08, 2024 pm 06:41 PM

最新の win11 にアップデートした後、システムのサウンドが少し変わったように感じますが、調整方法がわからないという人が多いので、このサイトでは、最新の win11 サウンド調整方法を紹介します。操作は難しくなく、選択肢も豊富ですので、ぜひダウンロードして試してみてください。最新のコンピュータ システム Windows 11 のサウンドを調整する方法 1. まず、デスクトップの右下隅にあるサウンド アイコンを右クリックし、「再生設定」を選択します。 2. 次に設定を入力し、再生バーの「スピーカー」をクリックします。 3. 次に、右下の「プロパティ」をクリックします。 4. プロパティの「拡張」オプションバーをクリックします。 5. この時、「すべての効果音を無効にする」の前にある√にチェックが入っている場合は、チェックを外します。 6. その後、以下の効果音を選択して設定し、クリックします。

See all articles