C++ 什么';这是一种在C+中对这些独立但相关的序列进行排序的干净方法+;?

C++ 什么';这是一种在C+中对这些独立但相关的序列进行排序的干净方法+;?,c++,sorting,vector,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
对象,它们包含以相同方式排序的不同类型的数据。我的情况是这样的:

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;
我知道这种安排不是非常面向对象的,可能有一种“更多的C++”方法来实现这一点。然而,我的环境中的其他约束迫使我进行这种类型的数据打包,因此我需要解决它。不幸的是,
vec2
中每个数据记录的长度(由
vec1
中对应的
data\u len
指定)直到运行时才知道,并且长度因记录而异

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

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

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

    bool operator<(const SortabelInfo &rhs) const { return info < rhs.info; }
};
vector<SortableInfo> vec3;
struct SortableInfo
{
信息;
矢量数据;

bool操作符我不知道导致您以这种方式捆绑数据的具体约束是什么,但是您的
vec3
选项接近于面向对象的方式

我要做的是,首先为你的结构(或类,取决于你的需要)创建一个向量,然后忘记单独的向量


您不能这样做有什么特殊原因吗?

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

struct SortableInfo {
    Info info;
    double *start_pos;

    bool operator<(const SortabelInfo &rhs) const { return info < rhs.info; }
}
struct SortableInfo{
信息;
双*启动位置;

bool操作符只需在信息中保留一个偏移量

struct Info
{
    int data_len;
    int offset;
    bool operator<(const Info &rhs) const
    {
        return (bool) irrelevant_operation_on_opaque_data;
    }
};
如果您还想支持delete,则必须重新定义所有的
偏移量
,而此解决方案可能没有那么有效

现在,您只需排序,仍然可以使用
偏移量
查找数据


只需定义一个新结构并将其用作包装器

struct ExtendedInfo
{
    Info info;
    int offset;
}

我对输入数据格式没有任何控制权;我从另一个无法更改的模块接收到它。你能从两个向量中存储一对迭代器的向量,并根据第一个迭代器对其进行排序吗?很清楚:你是否可以修改
Info
的定义?@Rob:谢谢,我刚刚意识到我应该不,我不能更改
Info
的定义。不确定为什么我没有想到这一点;这就是为什么我喜欢堆栈溢出。我认为我的最终解决方案将把
SortableInfo
视为一个“视图”然后,我对
SortableInfo
对象列表进行排序,然后根据需要取消对其成员的引用,以遍历排序后的序列。
vec1[0].offset = 350, vec1[0].data_len = 100 ==> vec2[350:450] = your data
struct ExtendedInfo
{
    Info info;
    int offset;
}