我对C ++非常陌生,我很难创建3D游戏板。在整个游戏过程中,棋盘的大小都会增加。
我的第一个想法是使用嵌套向量。 vector<vector<vector<int>>> board
想法是,它很容易访问(board[z][y][x]
),而我不会在动态分配方面遇到问题。但是我听说嵌套向量不是一个好主意,因为它破坏了“缓存友好性”。取而代之的是,我应该使用1d向量和“ fake”维度来进行数学计算。
我认为这意味着创建大小为(x * y * z)的向量。在那种情况下,当我想“转到” nested_vector_board [0] [1] [0]时,我使用board [x]。如果我想转到nested_vector_board [1] [1] [0],请使用board [x * y + x]。
我的理解正确吗?调整板子尺寸时该怎么办?例如,如果我想使板子更宽,则似乎需要手动移动所有数据。更重要的是,有没有更好,更简单的方法呢?
我将欢迎任何建议,并在此先非常感谢您!
如果您不知道您的访问模式将是什么,那么您将无法选择最佳解决方案。此外,如果您没有可行的解决方案,则无法衡量性能,只能猜测什么是最佳解决方案,并且您可能会猜错。
我建议使用清晰的界面来标记自己的3D电路板类,并检查您的简单解决方案是否足够好。如果太慢,可以将实现换成更合适的实现。
这是一个示例,说明如何实现您的电路板:
#include <iostream>
#include <unordered_map>
#include <map>
template <class ValueType>
class board_3d {
public:
using key_t = std::tuple<size_t, size_t, size_t>;
using value_t = ValueType;
ValueType& operator[](key_t key) {
return m_data[key];
}
const ValueType& operator[](key_t key) const {
return m_data[key];
}
private:
std::map<key_t, ValueType> m_data;
};
int main()
{
board_3d<int> my_board;
my_board[{0,0,0}] = 5;
return 0;
}
std::map
最终可能不是您想要的。访问为O(log n)。为了进行优化,您可以使用std::unordered_map
O(1)访问或使用向量的任何实现。您还可以添加一个调整大小功能,该功能负责将数据从旧存储复制到新存储。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句