C++排序索引 vector

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;
}

转自:https://www.cnblogs.com/linyuanzhou/p/6096939.html

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值