c++ - 使用 STL 排序就地排序表

标签 c++ algorithm sorting stl

我有一个存储为 (i,j,k) 格式(来自稀疏矩阵)的巨大表(大约 50Gb)

uint32_t * idx1, * idx2;
float * vals;
uint32_t tablesize;

并且我想使用作为 idx1 和 idx2 函数的给定比较函数对其进行适当的排序。这可以使用 std::sort 完成吗?

具体来说,稀疏矩阵中每个值为 v 的非零条目 (i,j) 的存储方式是将 i 放在 idx1 中,将 j 放在 idx2 中,将 v 放在 vals 中的相应条目中。然后我想根据 (i1, j1, v1) <= (i2, j2, v2) if

对这些条目进行排序
(i1 < i2) || (i1==i2 && j1 <= j2)

我能够搜集到的关于在非标准数据类型上使用 std::sort 的示例假设每个被比较的项目都是一个类的单个实例;这里每个项目都由不同数组中的三个值表示。

最佳答案

不幸的是,要说服 std::sort 或任何标准库使用 strip 化数据非常困难。它旨在假设数据可以通过单个 = 复制,通过一次 move 移动或通过一次 swap 交换。

最好的办法是使用 boost::iterator_facade 编写一个自定义迭代器类来包装数据,并从 std::sort 中隐藏 strip 数据格式。过去我想做类似的事情,但我的工作区不允许我们使用 boost编辑: 当您的门面被取消引用时,它可能需要创建某种可以分配/移动/交换的代理对象,并对每个 strip 数组做正确的事情。这不是微不足道的。

下一个最佳选择是制作一个从零到 N 的 int 数组,每个数组代表 strip 化数据数组中的一个索引。将自定义仿函数写入 std::sort 以对数组进行排序以符合您的条件。当您拥有如此庞大的数据集时,这显然远非理想。

关于c++ - 使用 STL 排序就地排序表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26876155/

相关文章:

c++ - 无法编译 mongo-cxx-driver

C++ 逐步枚举

c# - 实现动态 FlatCollection<T>

c++ - 对整数指针数组进行排序

C++:在不同类的派生对象的基指针上调用静态成员函数

c++ - C和C++中inline-keyword的区别

java - Java 中的 Floyd Warshall 具有 15000 个顶点的矩阵

image - 编写颜色配置文件以跨多个扫描仪标准化颜色

python - NumPy 还是字典?

java - 为双向链表的实现编写一个 add 方法,该链表在我向其中添加对象时进行排序