对矢量进行排序的最佳方法是什么,使原始矢量保持不变?

Emi*_*ano 7 c++ sorting stl

正如标题所说,我正在寻找一种方法来对矢量进行排序,而无需修改原始矢量.我的第一个想法当然是在排序之前创建一个向量副本,例如:

std::vector<int> not_in_place_sort(const std::vector<int>& original)
{
   auto copy = original;
   std::sort(copy.begin(), copy.end());
   return copy;
}
Run Code Online (Sandbox Code Playgroud)

但是,也许有一种更有效的方法来使用C++标准算法执行排序(可能是sorttransform?的组合)

Try*_*yer 7

这是我的最爱.对索引进行排序,而不是原始数组/向量本身.

#include <algorithm>

int main() {

    int intarray[4] = { 2, 7, 3, 4 };//Array of values
    //or you can have vector of values as below
    //std::vector<int> intvec = { 2, 7, 3, 4 };//Vector of values
    int indexofarray[4] = { 0, 1, 2, 3 };//Array indices

    std::sort(indexofarray, indexofarray + 4, [intarray](int index_left, int index_right) { return intarray[index_left] < intarray[index_right]; });//Ascending order.
    //have intvec in place of intarray for vector.


}
Run Code Online (Sandbox Code Playgroud)

在此之后,indexofarray[]元素将是0, 2, 3, 1,而intarray[]不会改变.


Ere*_*evi 6

使用partial_sort_copy。这是一个例子:

vector<int> v{9,8,6,7,4,5,2,0,3,1};
vector<int> v_sorted(v.size());
partial_sort_copy(begin(v), end(v), begin(v_sorted), end(v_sorted));
Run Code Online (Sandbox Code Playgroud)

现在,v保持不变,但是v_sorted包含{0,1,2,3,4,5,6,7,8,9}。

  • 这个解决方案被“高估”了:它没有解释为什么“partial_sort_copy”比最初复制向量并在结果上调用“std::sort”更好。只要两个范围长度相同,它就不是“部分”。更快吗?它更具可读性吗?我认为两者的答案都是“不”。 (7认同)
  • @SethJohnson 至少通过向量的复制传递应该会更快。这就是提问者可能想要实现的目标,不是复制然后排序,而是直接将排序后的值写入目标。“部分”实际上应该说“一般” (2认同)