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

时间:2012-03-09 20:01:26

标签: 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;

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

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中的每个数据记录的长度(由data_len中的vec1对应部分指定)直到运行时才知道,并且长度因记录而异。

我的问题:我想按一些标准对两个向量进行排序。排序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;

然后我会根据vec3vec1的内容适当填充vec2,对其进行排序,然后将数据再次扇出到单独的向量中。但是,这似乎并不特别有效。有关更好的执行方式的建议吗?

3 个答案:

答案 0 :(得分:1)

您可以将SortableInfo指针存储在相应vec2

中的起始位置
struct SortableInfo {
    Info info;
    double *start_pos;

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

填充您的vec3,对其进行排序,最后使用排序指针制作vec2的有序副本。

答案 1 :(得分:0)

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

我要做的是,首先只需要制作1个向量,结构(或类,取决于你的需要),然后首先忘记单独的向量。

为什么你不能这样做有什么特别的原因?

答案 2 :(得分:0)

只需在Info中保留一个偏移量

struct Info
{
    int data_len;
    int offset;
    bool operator<(const Info &rhs) const
    {
        return (bool) irrelevant_operation_on_opaque_data;
    }
};

偏移量只是vec2中的偏移量 所以现在你可以有例如

vec1[0].offset = 350, vec1[0].data_len = 100 ==> vec2[350:450] = your data

如果您还想支持删除,则必须重新定义所有offset,此解决方案可能效率不高。

现在您可以排序并仍然使用offset来查找数据。


只需定义一个新的Struct并将其用作包装器。

struct ExtendedInfo
{
    Info info;
    int offset;
}