作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我想创建一个非常易于使用的 2D 网格。网格中的每个单元格都需要能够存储大量数据。理想情况下,我希望能够一次遍历一个单元格,并获得任何网格单元格的直接邻居。
我的第一个想法是存储指向 Cell 邻居的指针 vector (总共 4 个),然后为 leftNeighbour、rightNeighbour 等创建便利函数。初始化后连接网格。
std::vector 应该是一个可动态调整大小的数组,所以如果我只想硬编码指针的位置(0 == 左,1 == 右, ETC)。但是,它确实提供了一种更好的方法来遍历单元格的邻居。我必须考虑的另一件事是单元格是否位于网格边缘的边界上(是对此进行测试还是只是隐式地将网格扩展一个单元格以便永远不会发生这种情况)。
谁能提出更好的替代方案,或者这听起来像是一个合理的设计?
谢谢丹
最佳答案
如果您想要一个四向迭代器,请自己制作:
template<typename T, int width, int height>
class Grid {
public:
T data[width * height];
iterator begin() {
return iterator(data);
}
iterator end() {
return iterator(data + width * height);
}
class iterator {
public:
iterator(const iterator &other) :
ptr(other.ptr)
{
}
iterator &left() const {
return iterator(ptr - 1);
}
iterator &right() const {
return iterator(ptr + 1);
}
iterator &up() const {
return iterator(ptr - width);
}
iterator &down() const {
return iterator(ptr + width);
}
iterator &operator++() {
++ptr;
return *this;
}
iterator &operator--() {
--ptr;
return *this;
}
iterator operator++(int) {
++*this;
return iterator(ptr + 1);
}
iterator operator--(int) {
--*this;
return iterator(ptr - 1);
}
T operator*() const {
return *ptr;
}
private:
iterator();
iterator(T *ptr_) :
ptr(ptr_)
{
}
T *ptr;
friend class Grid;
};
};
您可能想要检测是否触及了网格的边缘,以及其他必须实现的东西。
关于c++ - 如何在 C++ 中创建高效的二维网格?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/478165/
我是一名优秀的程序员,十分优秀!