std :: vectorがあります。これは、特定の操作で選択したアルゴリズムで並べ替える必要がありますが、それ以外の時間は元の状態(たとえば、入力されたときに並べ替えられたアイテム)を維持します。
明らかに、std :: copyを使用して一時的なベクトルを作成し、それを並べ替えることができますが、入力されたアイテムにタイムスタンプを付けるなど、より良い方法があるかどうか疑問に思っています。
乾杯
最初のベクトルのすべてのインデックスを保持するstd::vectorを作成できます。次に、必要に応じてインデックスベクトルを並べ替えることができます。これは高速である必要があり、最も重要なことは、最初のベクトルをコピーする必要があるという意味ではありません(おそらくよりコストがかかります!)。
Boostを少し気にしない場合は、MultiIndexライブラリを使用できます。いくつかのサンプルコードが見つかる私からのこの回答を参照してください。
基本的に、同じデータの複数の「ビュー」を保持し、それぞれの順序を変えることができます。あなたの場合、データが挿入順になっている「シーケンス」ビュー(ベクトルのように)と、データが何らかの基準に従ってソートされている「ソートされた」ビュー(マップのように)を維持できます。 。
任意のベクトルは、いつでも最大で1つの方法で並べ替えられます。
2つの選択肢があります。
一時的なベクトルにコピーし、必要に応じて並べ替えます。ベクトルが非常に大きく、スペースが限られている場合を除いて、これがほぼ確実に最善の方法です。パフォーマンスが心配な場合でも、コピーを作成するコストは並べ替えのコストよりも少なくなります。コピーのコストが大きい場合、並べ替えはコピーよりもはるかに遅くなります。
または、ベクトルを元の順序に並べ替えることができる方法(あなたが言及したタイムスタンプ?)を維持することもできます。ベクトルが非常に大きい場合にのみこれを実行したいので、これは遅くなりますが、一時的なベクトルを作成できない場合は、これが唯一の方法です。
並べ替えるアイテムが何であれ、複数の並べ替えフィールドを持つ構造でラップすることができます。
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
(または、基本構造自体に並べ替え順序を追加しますか?)
次に、必要に応じてさまざまな並べ替え順序を計算し、必要な並べ替え順序に応じてリストを並べ替えることができます。
それぞれに、元のデータへのスマートポインタを格納することをお勧めしますvector
。 std::vector
さまざまな並べ替え方法を提供できます。また、スマートポインターを使用すると、アイテムへのすべての参照が削除されると、それらは自動的に破棄されます。
インデックスを格納する別のベクトルを作成できます。コードは次のとおりです。
#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)