【发布时间】:2012-11-05 17:45:30
【问题描述】:
实现高效二维向量的正确方法是什么?我需要将一组 Item 对象存储在 2d 集合中,这样可以快速迭代(最重要)并且可以快速查找元素。
我有一个 2d 指针向量,声明如下:
std::vector<std::vector<Item*>> * items;
在构造函数中,我将其实例化如下:
items = new std::vector<std::vector<Item*>>();
items->resize(10, std::vector<Item*>(10, new Item()));
我如何(正确)实现访问项目的方法?例如:
items[3][4] = new Item();
AddItem(Item *& item, int x, int y)
{
items[x][y] = item;
}
我使用指针的原因是为了获得更好的性能,这样我就可以通过引用传递东西。
如果有更好的方法来解决这个问题,请解释一下,但是我仍然对如何正确使用向量感兴趣。
编辑:为澄清起见,这是一个简单游戏中用于库存管理的类的一部分。设置的 10x10 向量表示作为设置大小的库存网格。 Item 类包含项目类型、资源管理器中指向图像的指针、堆栈大小等。
我的指针使用是为了提高性能,因为这个类是迭代的,并使用图像指针在每一帧渲染整个库存。
【问题讨论】:
-
您想使用指针通过引用来传递东西,而不是使用 C++ 中已有的引用功能?声明变量/参数时,请参阅
&运算符。此外,您应该使用智能指针而不是原始指针。第三,您是否测量过这将是一个瓶颈,或者您只是在进行可能不需要的过早优化并且不必要地使代码复杂化? -
我对 c++ 还是很陌生,我会仔细看看 & 运算符,我的印象是我需要将东西存储为指针。这是学习练习的一部分,所以我没有看过智能指针,对效率很感兴趣。
-
Way 这段代码中的指针太多了。不要使用原始指针。拥有原始指针和硬指针,因此会导致错误(例如,在您的代码中,二维数组的每个元素都指向相同的
Item),并且也比正常方式慢 .不要那样做。 -
既然是二维向量,我觉得应该叫它矩阵。您知道编译时的大小 (10),因此您可以使用 boost 数组(如果您使用的是 C++11,则应考虑使用 std::array)而不是向量。由于数组在栈上分配元素,在堆上分配向量,因此与 stl 向量相比,数组可以具有更好的性能。
-
首先,不要担心性能问题,直到你找到了可以工作的东西。其次,动态分配可能相对昂贵,因此动态分配所有内容通常对性能不是很好。第三,您可以轻松引用非动态分配的事物。 (您确实必须了解生命周期问题,但动态分配也是如此。)