我有一个代表尺寸为40x40的2D地图的类。
我从传感器读取了一些数据,并且如果我的传感器发现某些东西并且设置了找到障碍物的可靠性值,则使用标记单元创建此地图。例如,当我在单元格[52,22]中发现一些障碍时,我将其值添加到例如10并添加到包围的单元格值5。
因此,这张地图的每个单元格应该保留一些小的值(可能不会更大)。因此,当一个细胞被传感器标记三次时,其值将为30,并且所述细胞将具有15个。
我的问题是,是否值得使用休闲数组或使用矢量更好,即使我不对这些单元格进行排序,也不要删除它们等等。我只是设置它的值,然后再读它?
更新 其实我的头文件中有:
using cell = uint8_t;
class Grid {
private:
int xSize, ySize;
cell *cells;
public:
//some methods
}
在cpp:
using cell = uint8_t;
Grid::Grid(int xSize, int ySize) : xSize(xSize), ySize(ySize) {
cells = new cell[xSize * ySize];
for (int i = 0; i < xSize; i++) {
for (int j = 0; j < ySize; j++)
cells[x + y * xSize] = 0;
}
}
Grid::~Grid(void) {
delete cells;
}
inline cell* Grid::getCell(int x, int y) const{
return &cells[x + y * xSize];
}
看起来不错吗?
答案 0 :(得分:4)
我使用std::array
而不是std::vector
。
对于固定尺寸的阵列,您可以获得STL容器的优势,并且具有“裸露”的性能。阵列。
答案 1 :(得分:2)
在您的情况下可以使用静态(C风格)数组,因为在编译时已知大小。
BUT。将数据放在堆而不是堆栈上可能会很有趣。
main()
函数中),则可能会发生堆栈溢出。嗯,40 * 40阵列的小东西是不太可能的,但我更喜欢把我的数据放在堆上,以保证安全,清洁和面向未来。所以,恕我直言,你应该选择向量,它快速,干净,可读,你不必担心堆栈溢出,内存分配等。
关于您的数据。如果你知道你的值可以存储在一个字节上,那就去吧!
uint8_t
(与unsigned char
相同)可以存储0到255之间的值。如果足够,请使用它。
using cell = uint8_t; // define a nice name for your data type
std::vector<cell> myMap;
size_t size = 40;
myMap.reserve(size*size);
旁注:不要使用new[]
。嗯,你可以,但它没有矢量优势。您可能只会手动处理内存的麻烦。
答案 2 :(得分:0)
使用std::vector
的一些优点是它可以动态分配(灵活的大小,可以在执行期间调整大小等),并且可以从函数传递/返回。由于您有一个固定的尺寸40x40
并且您知道每个单元格中都有一个元素int
,因此我认为在您的情况下这一点很重要,我不建议使用{{{ 1}}来处理这个简单的任务。
这可能是duplicate。