search
HomeDatabaseMysql TutorialCocos2d-x3.0中容器介绍(cocos2d::Vector)

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的数据类型。
Statement
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
如何使用Docker进行容器的故障恢复和自动重启如何使用Docker进行容器的故障恢复和自动重启Nov 07, 2023 pm 04:28 PM

Docker作为一种基于容器技术的轻量级虚拟化平台,已经被广泛应用于各种场景中。在生产环境中,容器的高可用性和故障自动恢复是至关重要的。本文将介绍如何使用Docker进行容器的故障恢复和自动重启,包括具体的代码示例。一、容器自动重启的配置在Docker中,通过在运行容器时使用--restart选项可以启用容器的自动重启功能。常见的选项有:no:不自动重启。默

华为、浪潮等单位合作创建的开源容器镜像中心,AtomHub,宣布正式开放公测,可稳定下载国内服务华为、浪潮等单位合作创建的开源容器镜像中心,AtomHub,宣布正式开放公测,可稳定下载国内服务Jan 02, 2024 pm 03:54 PM

华为官方消息显示,开放原子开发者大会以“一切为了开发者”为主题,在无锡举办了两天,时间为12月16日至17日会上,由开放原子开源基金会主导,华为、浪潮、DaoCloud、谐云、青云、飓风引擎以及OpenSDV开源联盟、openEuler社区、OpenCloudOS社区等成员单位共同发起建设的AtomHub可信镜像中心正式开放公测。AtomHub秉承共建、共治、共享的理念,旨在为开源组织和开发者提供中立、开放共建的可信开源容器镜像中心。鉴于DockerHub等镜像仓库的不稳定性和不可控性,以及一些

如何通过CMD在Windows 10或11上安装Redhat Podman如何通过CMD在Windows 10或11上安装Redhat PodmanOct 02, 2023 pm 09:33 PM

在Windows11或10上安装RedHatPodman请按照以下步骤使用命令提示符或Powershell在Windows机器上安装RedHatPodman:步骤1:检查系统要求首先,您必须确保您的Windows系统使用最新更新运行,以便它能够满足运行Podman的要求。您应该使用的是Windows11或Windows10版本1709(内部版本16299)或更高版本,并且必须启用适用于Linux2(WSL2)的Windows子系统和VM功能,好吧,如果它们尚未激活,那么您可以使用第二步命令执行此

C++ STL容器中常见类型有哪些?C++ STL容器中常见类型有哪些?Jun 02, 2024 pm 02:11 PM

C++STL中最常见的容器类型分别是Vector、List、Deque、Set、Map、Stack和Queue。这些容器为不同的数据存储需求提供了解决方案,例如动态数组、双向链表和基于键和值的关联容器。实战中,我们可以使用STL容器高效地组织和访问数据,例如存储学生成绩。

如何排序C++ STL容器?如何排序C++ STL容器?Jun 02, 2024 pm 08:22 PM

C++中对STL容器排序的方法:使用sort()函数,原地排序容器,如std::vector。使用有序容器std::set和std::map,元素在插入时自动排序。对于自定义排序顺序,可以使用自定义比较器类,如按字母顺序排序字符串向量。

Python 作为小程序后端的三种方法Python 作为小程序后端的三种方法Apr 12, 2023 pm 09:10 PM

你好,我是征哥。微信的小程序是一个很不错的体验,简单,上手快,这几天也在学习使用小程序,自己总结了三种用 Python 作为小程序后端的方式,供你参考。方法一、微信的云托管[1]。优点:不需要购买服务器,不需要域名备案,按使用量计费,DevOps 自动化,安全鉴权,适合没有运维经验的人。缺点:费用这块,肯定是比自建服务器费用略高的。就像同一车型,自动挡的车比手动挡的车更贵一样。所谓云托管,就是一个 Docker 容器,你只需要弄一个仓库,可以 github, gitlab, gitee 中的任意

学习Go语言的微服务架构和容器技术学习Go语言的微服务架构和容器技术Nov 30, 2023 am 11:14 AM

学习Go语言的微服务架构和容器技术随着云计算和大数据的快速发展,微服务架构和容器技术在软件开发领域变得越来越流行。而Go语言作为一种开源的、高效的编程语言,正因其强大的并发性和简洁的语法而受到广泛关注。本文将介绍学习Go语言微服务架构和容器技术的相关知识和方法。首先,我们来了解一下微服务架构。微服务架构是一种通过将应用程序拆分为一系列较小的、独立的服务来构建

使用C++部署机器学习模型:容器和云的最佳实践使用C++部署机器学习模型:容器和云的最佳实践May 31, 2024 pm 08:09 PM

使用C++部署机器学习模型:容器和云的最佳实践容器化和云部署已成为部署机器学习模型的最佳实践,它们能够提供可移植性、可扩展性和可维护性。本文将深入探讨使用C++在容器和云中部署机器学习模型的最佳实践,并提供一个实战案例。使用容器容器的好处可移植性:容器将代码及其依赖项打包在一起,可在任何环境中运行。隔离性:容器将模型与主机系统隔离,确保模型免受潜在问题的影响。轻量级:容器比虚拟机更轻量,启动速度更快。创建容器映像使用Docker构建容器映像:FROMtensorflow/tensorf

See all articles

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

AI Hentai Generator

AI Hentai Generator

Generate AI Hentai for free.

Hot Article

R.E.P.O. Energy Crystals Explained and What They Do (Yellow Crystal)
3 weeks agoBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Best Graphic Settings
3 weeks agoBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. How to Fix Audio if You Can't Hear Anyone
3 weeks agoBy尊渡假赌尊渡假赌尊渡假赌

Hot Tools

VSCode Windows 64-bit Download

VSCode Windows 64-bit Download

A free and powerful IDE editor launched by Microsoft

MantisBT

MantisBT

Mantis is an easy-to-deploy web-based defect tracking tool designed to aid in product defect tracking. It requires PHP, MySQL and a web server. Check out our demo and hosting services.

mPDF

mPDF

mPDF is a PHP library that can generate PDF files from UTF-8 encoded HTML. The original author, Ian Back, wrote mPDF to output PDF files "on the fly" from his website and handle different languages. It is slower than original scripts like HTML2FPDF and produces larger files when using Unicode fonts, but supports CSS styles etc. and has a lot of enhancements. Supports almost all languages, including RTL (Arabic and Hebrew) and CJK (Chinese, Japanese and Korean). Supports nested block-level elements (such as P, DIV),

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)