【发布时间】:2020-07-14 10:31:50
【问题描述】:
假设你有一个如下定义的二维向量:
std::vector<vector<int>> v
其中代表一个矩阵:
1 1 0 1 3
0 4 6 0 1
5 0 0 3 0
6 3 0 2 5
我想稳定分区(比如用谓词 el != 0)这个矩阵,但在所有方向。这意味着我希望能够得到:
1 1 6 1 3 0 0 0 0 0 1 1 1 3 0 0 1 1 1 3
5 4 0 3 1 1 1 0 1 3 4 6 1 0 0 0 0 4 6 1
6 3 0 2 5 5 4 0 3 1 5 3 0 0 0 0 0 0 5 3
0 0 0 0 0 6 3 6 2 5 6 3 2 5 0 0 6 3 2 5
(down) (up) (right) (left)
对于两个方向,这可以通过迭代外部向量并分割内部向量(按顺序或反向)非常简单地完成。但是对于其他方向,我不知道如何去做。
有没有办法使用std::stable_partition 来实现这一点。是否有另一种数据结构(支持像向量这样的索引)可以让我更轻松地做到这一点?
如果我让我从头开始实施,是否有标准或推荐的方法来做到这一点?
【问题讨论】:
-
你可以用向量来做到这一点,它只是不会超级高效,因为数据在内存中不相邻。链表数据矩阵可能也好不了多少。如果您可以用一维数据和隐式行或列大小表示您的二维矩阵,它可能会更好,但您需要进行基准测试。
-
我可能会为 2d 向量编写列迭代器,然后使用标准算法(对于行,您可以使用标准算法轻松划分内部向量),相反,您只需要反向迭代器
-
@idclev463035818 我想你的意思是正确的迭代器并以某种方式重载 ++ 运算符成为 it = it + col_nb ...我不确定我该怎么做,你能解释一下吗?
-
@AndyG 效率并不是一个真正的大问题,矩阵会相对较小。我只想找到最简单、最清晰的方法。最好不必从头开始编写 stable_partition 实现。
-
迭代器需要的不仅仅是
++运算符,不幸的是,编写自己的迭代器需要大量样板文件。也许我会试一试并发布答案......
标签: c++ algorithm c++14 data-partitioning