【发布时间】:2015-11-27 14:59:10
【问题描述】:
我正在使用 C++(使用 c++11 标准)进行编码,并且我有两个内置类型的大数组,我想根据第一个对第二个进行排序。 这是一个例子:
A = {1, 5, 4, 3, 6, 2};
B = {1, 2, 3, 4, 5, 6};
排序后:
A = {1, 2, 3, 4, 5, 6};
B = {1, 6, 4, 3, 2, 5};
就好像每个元素 B[i] 都附加到元素 A[i] 上,而您只需对数组 A 进行排序。所以B 中的元素会根据A 中的对应元素移动。我知道这个问题被问了一遍又一遍,但我遇到的唯一解决方案是使用pair<type 1, type 2>。但是考虑到数组很大,为pair数组分配内存并来回复制数组需要相当长的时间。
但我相信排序可以就地完成,即仅使用O(1) 内存。事实上,如果 std::sort 允许进行服装交换,那就没问题了。因为我认为这是排序算法使用的比较器之外唯一的东西。
A = vector<double>(1e6); // some random numbers
B = vector<double>(1e6); // some random numbers
Comp comp(&A,&B);
Swap swap(&A,&B);
costume_sort(A,B,comp,swap); // some sort function that can take costume swap and compare
class Comp {
vector<double> *A;
vector<double> *B;
Comp(vector<double> *A, vector<double> *B) : A(A),B(B) {};
bool compareTo(size_t i, size_t j) { return A->at(i) < A->at(j); };
};
class Swap {
vector<double> *A;
vector<double> *B;
Swap(vector<double> *A, vector<double> *B) : A(A),B(B) {};
void swapFnc(size_t i, size_t j) { swap(A->at(i), A->at(j));swap(B->at(i), B->at(j)); };
};
STL 或其他可用库中是否有任何功能可以做到这一点?这是我试图在这里解释的想法的一种伪代码。显然这并不准确,但我希望我的意思很清楚。
【问题讨论】:
-
@LeFlou 我在更新的问题中提供了一个示例。就像你对 A 进行排序,B 的每个元素都附加到 A 中的相应元素。(B 中的元素
i附加到 A 中的元素i) -
你真的希望两个向量都是
double吗?还是一个double和一个std::size_t? -
@GuyGreer 实际上现在我正在处理一个
double一个uint64_t。但我希望我可以忽略一个是整数的事实,并以更通用的方式编写代码。但是,如果有一个仅适用于整数的巧妙解决方案,我也很高兴知道这一点。 -
看看stackoverflow.com/a/32720638/1566221,它使用了标准库中提议添加的参考实现。
-
考虑一张std::pair的表,或者更好的std::tupple。
标签: c++ arrays sorting c++11 bigdata