c++ - 在 C++ 中对这些独立但相关的序列进行排序的简洁方法是什么?

标签 c++ sorting vector

我有两个 vector 对象,它们包含以相同方式排序的不同类型的数据。我的情况看起来像这样:

struct Info
{
    double opaque_data_not_relevant_to_this_problem[6];
    int data_len;

    bool operator<(const Info &rhs) const
    {
        return (bool) irrelevant_operation_on_opaque_data;
    }
};

vector<Info> vec1;
vector<double> vec2;

对于 vec1 中的每个 Info 条目,vec2 包含一系列 double 值,长度等于vec1 中相应元素中 data_len 的值。例如:

vec1[0].data_len == 100 ==> vec2[0:99] correspond to vec1[0]
vec1[1].data_len == 150 ==> vec2[100:249] correspond to vec1[1]
// and so on

我知道这种安排不是很面向对象,可能有一种“更多 C++”的方式来做到这一点。但是,我环境中的其他限制迫使我采用这种类型的数据打包,因此我需要解决它。不幸的是,vec2 中每个数据记录的长度(由 vec1 中对应的 data_len 指定)直到运行时才知道,并且长度会变化从记录到记录。

我的问题:我想按某些标准对两个 vector 进行排序。排序 vec1 很简单,因为我可以使用 std::sort。然而,与此同时,我需要对 vec2 进行排序,以便仍然保持上述顺序(即 vec2 中的第一个值 block 对应于 vec1 [0] 排序后)。如果我能从排序过程中得到某种“索引 vector ”,然后我可以用它来重新排序 vec2 就好了(就地或异地操作都可以) ,但我不确定使用标准库(如果有的话)有什么好的方法来做到这一点。

我可以通过定义将两者捆绑在一起的第二个中间结构来进行排序:

struct SortableInfo
{
    Info info;
    vector<double> data;

    bool operator<(const SortabelInfo &rhs) const { return info < rhs.info; }
};
vector<SortableInfo> vec3;

然后我会根据 vec1vec2 的内容适本地填充 vec3,对其进行排序,然后将数据散开以分离再次 vector 。但是,这似乎不是特别有效。关于更好的执行方法有什么建议吗?

最佳答案

您可以在 SortableInfo 中存储指向相应 vec2 中起始位置的指针

struct SortableInfo {
    Info info;
    double *start_pos;

    bool operator<(const SortabelInfo &rhs) const { return info < rhs.info; }
}

填充您的 vec3,对其进行排序,然后在最后使用排序后的指针制作您的 vec2 的有序拷贝。

关于c++ - 在 C++ 中对这些独立但相关的序列进行排序的简洁方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9640204/

相关文章:

c++ - 根据另一个 vector 对点 vector 进行排序

c++ - 如何让一个方法访问其他模板类实例的私有(private)成员?

javascript - 仅使用 javaScript 按具有日期值 desc 的列对 HTML 中的表进行排序

ruby-on-rails - 如何按关联模型计数对 ActiveRecord 结果进行排序?

arrays - 在 CoreData 中使用单个实体时如何持久重新排序项目?

c++ - 从文本文件初始化 vector

c++ - 换显卡后需要重新安装cuda吗

c++ - 是否有更好(更有效)的方法来查找是否可以从另一个字符串的字符形成一个字符串?

c++ - 为 ORM C++ 实现 1 到 n 映射

c++ - 使用递归检查 vector 是否为最小堆