我有两个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;
然后我会根据vec3
和vec1
的内容适当填充vec2
,对其进行排序,然后将数据再次扇出到单独的向量中。但是,这似乎并不特别有效。有关更好的执行方式的建议吗?
答案 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;
}