这个问题与这里提出的问题类似,然而,这个答案对我的问题无效,而且稍有不同。
我试图做的最好通过代码展示:
//this would be a copy version:
int main(){
std::vector<uint32_t> order = {0,2,5,6,9,10,1,3,4,7,8,11};
std::vector<uint32_t> example = {0,1,2,3,4,5,6,7,8,9,10,11};
std::vector<uint32_t> output(order.size());
for(uint32_t i = 0; i < order.size(); ++i){
output[i] = example[order[i]];
}
}
//output comes out to {0,2,5,6,9,10,1,3,4,7,8,11}
然而,当我尝试使用上述链接中的重新排序代码来实现原地版本时:
void reorder(std::vector<uint32_t> &v, std::vector<uint32_t> const &order ) {
for ( int s = 1, d; s < order.size(); ++ s ) {
for ( d = order[s]; d < s; d = order[d] ) ;
if ( d == s ) while ( d = order[d], d != s ) std::swap( v[s], v[d] );
}
}
int main(){
std::vector<uint32_t> order = {0,2,5,6,9,10,1,3,4,7,8,11};
std::vector<uint32_t> example = {0,1,2,3,4,5,6,7,8,9,10,11};
reorder(example, order);
}
//example = {0,6,1,7,8,2,3,9,10,4,5,11,}
我如何在不复制内存的情况下实现我正在尝试完成的就地版本?
编辑
我想要更清楚一些,代码中的向量 example
可以是任意元素,我只是偶尔使用了特定的初始化方式以便于检查。以下示例完全有效:
std::vector<uint32_t> example = {300,12,21,34,47,15,61,57,82,94,1,2};
order
和example
始终包含相同数量的元素。- 不能保证
order
和example
存储相同的数据类型。 - 可以确保
order
存储唯一值。 - 可以确保
order
始终是uint32_t
数据类型。 order
的范围始终为0到n-1
,其中n
是example
的大小,每个数字仅出现一次,并且不超出该范围(就像示例代码中一样)。- 该范围的实际顺序完全随机,与偶数或奇数索引无关,也不按任何顺序。
order
中的所有值都是唯一且有效的索引。然后,你可以逐个元素地交换order
中的内容和std::swap(order[i], example[order[i]]);
,然后再执行std::swap(example, order);
。然而,这确实需要order
是非常量的,同时还需要满足其他所有条件。 - paddyorder
和example
包含的元素数量是保证相同的吗?order
和example
存储的数据类型是保证相同的吗?order
中的每个索引都是唯一的吗?您在回答中提供了更新,但是没有澄清这些问题。 - paddy