cocos2d-x怎么用vector存struct结构体

2015年01月25日 10:26 0 点赞 0 评论 更新于 2025-11-21 15:23

最近我一直在研究如何在 cocos2d-x 中使用 std::vector 存储 struct 结构体,现在将研究成果分享出来,供大家学习参考。

1. std::vector 基本用法

std::vector 是 C++ 标准库中的容器,可将其理解为数组的扩展,由程序动态管理内存。其基本定义格式如下:

std::vector<T> v;
  • std 是命名空间。
  • T 表示存储对象的类型,可以是整型 int、字符串 std::string、结构体 struct 或者自定义的类。

更多关于 std::vector 的详细信息,可参考维基百科

2. 实际应用场景及代码示例

假设我们需要一个对象,该对象有 4 个属性,并且要从 XML 文件中读取数据,将数据赋值给对象,然后添加到数组中进行统一操作。若使用类加数组的方式可以实现,但效率不高。下面看看如何使用 structstd::vector 来实现:

头文件(.h)代码

#include <string>
#include <vector>

struct config {
std::string name;
std::string id;
std::string price;
std::string description;
};

std::vector<config> item_config;

源文件(.cpp)代码

#include "your_header_file.h"  // 替换为实际的头文件名

// 初始化一个 config 对象
config item;
item.name = "bomb";
item.id = "0";
item.price = "100";
item.description = "土制炸弹,威力一般,但很便宜";

// 将对象添加到 vector 中
item_config.push_back(item);

// 访问 vector 中的元素
std::string name = item_config[0].name;

使用 structstd::vector 的组合非常方便,相比使用数组和类的方式,代码量更少,而且无需使用 new 进行内存分配,也无需使用 -> 操作符。

3. std::vector 常用操作方法

3.1 访问元素的方法

  • vec[i]:访问索引值为 i 的元素引用。索引值从 0 开始,因此第一个元素是 vec[0]
  • vec.at(i):访问索引值为 i 的元素的引用。使用 at() 访问会进行数组边界检查,如果访问越界将会抛出一个异常,这是与 operator[] 的唯一差异。
  • vec.front():返回 vector 第一个元素的引用。
  • vec.back():返回 vector 最后一个元素的引用。

3.2 新增或移除元素的方法

  • vec.push_back():新增元素至 vector 的尾端,必要时会进行内存分配。
  • vec.pop_back():删除 vector 最尾端的元素。
  • vec.insert():插入一个或多个元素至 vector 内的任意位置。
  • vec.erase():删除 vector 中一个或多个元素。
  • vec.clear():清空所有元素。

3.3 取得长度/容量的方法

  • vec.size():取得 vector 目前持有的元素个数。
  • vec.empty():如果 vector 内部为空,则返回 true
  • vec.capacity():取得 vector 目前可容纳的最大元素个数。该方法与内存的分配有关,它通常只会增加,不会因为元素被删减而随之减少。

3.4 重新配置/重设长度的方法

  • vec.reserve():如有必要,可改变 vector 的容量大小(配置更多的内存)。在众多的 STL 实现中,容量只能增加,不可以减少。
  • vec.resize():改变 vector 目前持有的元素个数。

3.5 迭代器相关方法

  • vec.begin():返回一个迭代器,它指向 vector 第一个元素。
  • vec.end():返回一个迭代器,它指向 vector 最尾端元素的下一个位置(注意:它不是最后一个元素)。
  • vec.rbegin():返回一个反向迭代器,它指向 vector 最尾端元素。
  • vec.rend():返回一个反向迭代器,它指向 vector 的第一个元素。