gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 08:08:41 25 4
gpt4 key购买 nike

我有两个 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com