gpt4 book ai didi

c++ - C++ 中的 3D 运动场

转载 作者:行者123 更新时间:2023-12-01 13:10:01 25 4
gpt4 key购买 nike

我是 C++ 的新手,我很难创建 3D 游戏板。 棋盘的大小可以在整个游戏过程中增加

我的第一个想法是使用嵌套 vector 。 vector<vector<vector<int>>> board

我的想法是,它很容易访问(board[z][y][x]),而且我不会遇到动态分配问题。但是我听说嵌套 vector 不是一个好主意,因为它破坏了“缓存友好性”。相反,我应该使用 1d vector 和使用数学的“假”维度。

我认为这意味着创建大小为 (x * y * z) 的 vector 。在这种情况下,当我想“转到”nested_vector_board[0][1][0] 时,我使用 board[x]。如果我想转到 nested_vector_board[1][1][0],我会使用 board[x * y + x]。

我的理解对吗?调整板子大小怎么办?例如,如果我想让板子更宽,似乎我需要手动移动所有数据。更重要的是,是否有更好、更简单的方法来做到这一点?

我将欢迎任何建议,并在此先感谢您!

最佳答案

如果您不知道您的访问模式是什么,您就无法选择最佳解决方案。此外,如果您没有可行的解决方案,您将无法衡量您的表现,只能猜测什么是最佳解决方案,而且您很可能会猜错。

我建议使用清晰的界面实现您自己的 3D Board 类,并检查您的简单解决方案是否足够好。如果它太慢,您可以将实现替换为更适合的实现。

这是一个示例,您可以如何实现您的板:

#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)。要优化您可以使用具有 O(1) 访问权限或使用 vector 的任何实现的 std::unordered_map。您还可以添加调整大小功能,负责将数据从旧存储复制到新存储。

关于c++ - C++ 中的 3D 运动场,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60697959/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com