我正在用C ++创建游戏应用程序。我将地图表示为std::vector
个Tile
个对象的for
。
我需要在玩家移动时更新该地图。从服务器应用程序中,我获得了包含全局地图新部分的行或列,该部分应放在本地客户端的地图中,例如:
在图1中,在玩家移动之前有一张本地地图。顶行填充对象1,中心为2,底部为0.现在当玩家向上移动时,我得到新的顶行填充对象3,其他所有其他都应该向下,前一个底行应该消失。
我可以通过在{{1}}循环中移动所需的对象来实现,但我在想是否在标准库中已经存在某种算法,或者通过许多有效的方式来实现这种修改。
编辑:
抱歉,我没有意识到对行和列进行此操作会有区别,但确实有。所以我也编辑了我的头衔,因为我有时也需要为专栏做这个。
答案 0 :(得分:6)
您可能希望实现迭代器,并且根本不移动向量的元素。只需为顶行(在屏幕上)的索引定义变量,然后使用模运算符迭代所有行(因此只有000行应该用333覆盖,而顶行索引将是2而不是0)。该算法是有效的(只需要根据需要进行多次内存写入),并且可以用于向任何方向滚动:
答案 1 :(得分:3)
当您需要在两个两端快速插入/擦除时,会立即想到两个标准容器:std::deque
和std::list
。但是它们有其特殊的要求和限制。
如果你遇到了一个向量,你可以利用C ++ 11移动语义,这将允许你有效地移动对象而不是复制它们,或者@WebMonster提到你可以使用某种循环索引到你的缓冲区完全消除了移动/复制的需要。
鉴于您的要求,并假设它们已经完成,我可能会选择@WebMonster最有效的解决方案。 编辑:既然您的要求已经改变,而且您还需要滚动列,他的解决方案“循环索引”绝对是可行的方法。
答案 2 :(得分:2)
你可以使用专门用于向量的std :: swap并且效率很高,因为它只需要几个指针交换两个向量。此外,您可以使用std :: rotate,但我不确定它是否使用交换技术。
不幸的是,只有当你有一个行向量并且你需要移动行,或者你有一个列向量并且需要移动列时,这才会起作用。 似乎要有效地执行这两个操作,您必须使用一些更复杂的数据结构。
答案 3 :(得分:2)
我会试试boost matrix。
答案 4 :(得分:0)
可能的方法是使用:
protected override void OnNavigatedTo(NavigationEventArgs e)
{
object parameter = e.Parameter;
base.OnNavigatedTo(e);
}
用于移动2D std::std::swap_ranges()
和
std::vector
用于修改需要用新值替换的行。