最新文章
Cocos2d-x游戏开发实例详解7:对象释放时机
03-25 13:59
Cocos2d-x游戏开发实例详解6:自动释放池
03-25 13:55
Cocos2d-x游戏开发实例详解5:神奇的自动释放
03-25 13:49
Cocos2d-x游戏开发实例详解4:游戏主循环
03-25 13:44
Cocos2d-x游戏开发实例详解3:无限滚动地图
03-25 13:37
Cocos2d-x游戏开发实例详解2:开始菜单续
03-25 13:32
cocos2d-x怎么用vector存struct结构体
最近我一直在研究如何在 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 文件中读取数据,将数据赋值给对象,然后添加到数组中进行统一操作。若使用类加数组的方式可以实现,但效率不高。下面看看如何使用 struct 和 std::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;
使用 struct 和 std::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的第一个元素。