我有一个std :: vector,我需要根据选定的算法对某些操作进行排序,但是要在其余时间保持原始状态(例如,在输入时排序的项目)。
显然我可以使用std :: copy创建一个临时向量并对其进行排序,但我想知道是否有更好的方法,可能是通过对输入的项目加时间戳。
干杯
答案 0 :(得分:19)
您可以创建一个std :: vector,它包含第一个向量的所有索引。然后,您可以根据需要对索引向量进行排序。这应该很快,最重要的是,并不意味着你必须复制第一个载体(这可能更昂贵!)。
答案 1 :(得分:4)
如果你不介意一点Boost,你可以使用MultiIndex库。请参阅我的this answer,在那里您可以找到一些示例代码。
基本上,它允许您保留相同数据的多个“视图”,每个视图具有不同的顺序。在您的情况下,您将能够保持“序列”视图,其中数据按插入顺序(如矢量)和“排序”视图,其中数据根据某些标准(如地图)进行排序。
答案 2 :(得分:2)
任何给定的矢量在任何时候都会以最多一种方式排序。
有两种选择:
复制到临时矢量并根据需要对其进行排序。除非向量非常大并且你的空间有限,否则这几乎肯定是最好的方法。即使您担心性能,制作副本的成本也会低于分类成本,如果复制成本很高,那么排序将比复制慢得多。
或者,你可以保持某种方式(你提到的时间戳?)能够将向量排序回原始顺序。这将是缓慢的,因为如果向量非常大,你只想这样做,但如果你不能制作一个临时向量,这是唯一的方法。
答案 3 :(得分:0)
无论您要排序的是什么项目,都可以将其包装在具有多个排序字段的结构中。
struct someThing
{
int sortOrder1;
int sortOrder2;
...
int sortOrderN;
//payload data object here
} //note: this code may have some sytax errors (I haven't actually tried compiling this ;), but hope the idea is clear
(或者可能将排序顺序添加到基础结构本身?)
然后,当您需要时,可以计算不同的排序顺序,并根据您需要的排序顺序重新排序列表。
答案 4 :(得分:0)
我建议在每个vector
中将智能指针存储到原始数据中。 std::vector
允许您提供不同的排序方法。此外,使用智能指针,当删除对项目的所有引用时,它们将自动销毁。
答案 5 :(得分:0)
您可以创建另一个向量来存储索引。这是代码:
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main()
{
vector<int> numbers = {50,30,20,10,40};
vector<int> indexOfNumbers;
for(int i = 0; i < numbers.size(); i++)
{
indexOfNumbers.push_back(i);
}
// Now, indexOfNumbers = [0,1,2,3,4]
std::sort(
indexOfNumbers.begin(), indexOfNumbers.end(),
[numbers](int leftIndex, int rightIndex)
{
return numbers[leftIndex] < numbers[rightIndex]; // sort in ascending order
}
);
// After sorting, indexOfNumbers = [3, 2, 1, 4, 0]
// Access the sorted elements
cout << "Accessing the sorted elements : ";
for(int i = 0; i < numbers.size(); i++)
{
cout << numbers[indexOfNumbers[i]] << " ";
}
// prints numbers in sorted order i.e. [10,20,30,40,50]
return 0;
}
来源:根据Tyrer的回答(https://stackoverflow.com/a/47537314)进行了一些修改