我有两个 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;
然后我会根据 vec1
和 vec2
的内容适本地填充 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/