c++中sort算法只能數據進行排序,不能像matlab那樣返回索引排序,可以使用下列方法解決
使用c++11:
template < typename T> vector< size_t> sort_indexes(const vector< T> & v) { // initialize original index locations vector< size_t> idx(v.size()); for (size_t i = 0; i != idx.size(); ++i) idx[i] = i; // sort indexes based on comparing values in v sort(idx.begin(), idx.end(), [& v](size_t i1, size_t i2) {return v[i1] < v[i2];}); return idx; }
其中sort(idx.begin(), idx.end(), [& v](size_t i1, size_t i2) {return v[i1] < v[i2];});
使用了lambda語法
由於本人在caffe中需要使用該算法,但是開啟c++11支持會導致編譯出現問題,不過可以通過以下方法解決:
------解決方案--------------------
vector<int> v;
v.push_back(3);
v.push_back(1);
v.push_back(2);
multimap<int, int> m;
for (int i=0; i<v.size(); ++i)
m.insert(make_pair(v[i], i) );
// then get each value of m, it's the index of v.
------解決方案--------------------
建立一個索引數組,排序即可
另外,可以試試,對 iterator 排序
template<typename T>
bool cmp(const vector<T>::iterator &a,const iterator&b)
{
return *a < *b;
}
template<typename T>
void SortAndOutputIndex(const vector &v)
{
vector <vector<T>::iterator >vi;
for(vector<T>::iterator it= v.begin();it!= v.end();it++)
vi.push_back(it);
sort(vi.begin(),vi.end(),cmp);
for(vector<vector<T>::iterator >::iterator it= vi.begin();it!= vi.end();it++)
cout<<(*it -v.begin())<<" ";
cout<<endl;
}