7

I'm creating game application in C++. I have map represented as 2-dimensional std::vector of Tile objects.

I need to update that map as player moves. From server application I get row or column with a new part of global map, which should be placed in local client's map, for example:

enter image description here

In a figure 1 there's a local map before player moves. Top row is filled with objects 1, center with 2 and bottom with 0. Now when player moves up, I get new top row filled with objects 3 and all the others should go down, and the previous bottom row should disappear.

I can do it just by moving required objects in for loops, but I was thinking if there's already some kind of algorithm in standard library or prefered by many, efficient way to achieve this kind of modifications.

EDIT:

Sorry I didn't realize that there would a difference between doing this operation for row and for column, but indeed there is. So I also editted my title, because I sometimes need to do it for column too.

4

5 回答 5

6

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

  • 向上移动:递减顶行索引(mod 行号),改变最后一行
  • 向下移动:增加顶行索引(mod 行号),改变第一行
  • 左移:减左列索引(mod col 编号),改变最后列
  • 向右移动:增加左列索引(mod col 编号),更改第一个列。
于 2013-04-25T09:18:17.027 回答
3

当您需要在两端快速插入/擦除时,会立即想到两个标准容器:std::dequestd::list. 然而,它们有其特定的要求和限制。

如果您被向量困住,您可以利用 C++11 移动语义,这将允许您有效地移动对象而不是复制它们,或者正如@WebMonster 提到的,您可以在缓冲区中使用某种循环索引,这完全无需移动/复制。

鉴于您的要求,并假设它们是完整的,我可能会选择最有效的@WebMonster 解决方案。编辑:既然您的要求已经改变并且您还需要在列上滚动,他的解决方案“循环索引”绝对是要走的路。

于 2013-04-25T09:21:15.363 回答
2

我会尝试提升矩阵。

于 2013-04-25T09:24:07.130 回答
2

您可以使用专门用于向量且高效的 std::swap,因为它只需要对两个向量进行几次指针交换。此外,您可以使用 std::rotate,但我不确定它是否使用交换技术。

不幸的是,只有当你有一个行向量并且你需要移动行,或者你有一个列向量并且你需要移动列时,这才有效。似乎要有效地完成这两项操作,您必须使用一些更复杂的数据结构。

于 2013-04-25T09:21:08.403 回答
0

一种可能的方法是使用:

std::std::swap_ranges()用于移动 2D 中已经存在的行std::vector

std::transform()用于修改需要用新值替换的行。

于 2017-05-07T15:29:34.577 回答