在2D std :: vector中移动行/列的最有效方法

时间:2013-04-25 09:11:53

标签: c++ performance algorithm vector multidimensional-array

我正在用C ++创建游戏应用程序。我将地图表示为std::vectorTile个对象的for

我需要在玩家移动时更新该地图。从服务器应用程序中,我获得了包含全局地图新部分的行或列,该部分应放在本地客户端的地图中,例如:

enter image description here

在图1中,在玩家移动之前有一张本地地图。顶行填充对象1,中心为2,底部为0.现在当玩家向上移动时,我得到新的顶行填充对象3,其他所有其他都应该向下,前一个底行应该消失。

我可以通过在{{1}}循环中移动所需的对象来实现,但我在想是否在标准库中已经存在某种算法,或者通过许多有效的方式来实现这种修改。

编辑:

抱歉,我没有意识到对行和列进行此操作会有区别,但确实有。所以我也编辑了我的头衔,因为我有时也需要为专栏做这个。

5 个答案:

答案 0 :(得分:6)

您可能希望实现迭代器,并且根本不移动向量的元素。只需为顶行(在屏幕上)的索引定义变量,然后使用模运算符迭代所有行(因此只有000行应该用333覆盖,而顶行索引将是2而不是0)。该算法是有效的(只需要根据需要进行多次内存写入),并且可以用于向任何方向滚动:

  • 向上移动:递减顶行索引(mod行号),更改最后一行
  • 向下移动:增加顶行索引(mod行号),更改第一行
  • 向左移动:递减左侧col索引(mod col number),更改最后一个col
  • 向右移动:增加左侧col索引(mod col number),更改第一个col。

答案 1 :(得分:3)

当您需要在两个两端快速插入/擦除时,会立即想到两个标准容器:std::dequestd::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用于修改需要用新值替换的行。