以下のプログラム ("from here" の後の行) は、私が頻繁に使用しなければならない構造です。(最終的に固有ライブラリの関数を使用して) ベクトル化するか、このプログラムをより高速に実行できるかどうか疑問に思っていました。
基本的に、 のベクトルが与えられたfloat
x
場合、この構文は のソートされた要素のインデックスをベクトル に復元x
しint
ますSIndex
。たとえば、 の最初のエントリSIndex
が 10 の場合、 の 10 番目の要素x
が の最小の要素であったことを意味しx
ます。
#include <algorithm>
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <vector>
using std::vector;
using namespace std;
typedef pair<int, float> sortData;
bool sortDataLess(const sortData& left, const sortData& right){
return left.second<right.second;
}
int main(){
int n=20,i;
float LO=-1.0,HI=1.0;
srand (time(NULL));
vector<float> x(n);
vector<float> y(n);
vector<int> SIndex(n);
vector<sortData> foo(n);
for(i=0;i<n;i++) x[i]=LO+(float)rand()/((float)RAND_MAX/(HI-LO));
//from here:
for(i=0;i<n;i++) foo[i]=sortData(i,x[i]);
sort(foo.begin(),foo.end(),sortDataLess);
for(i=0;i<n;i++){
sortData bar=foo[i];
y[i]=x[bar.first];
SIndex[i]=bar.first;
}
for(i=0;i<n;i++) std::cout << SIndex[i] << std::endl;
return 0;
}