zoukankan      html  css  js  c++  java
  • c++排序索引

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

  • 相关阅读:
    JAVA中HashMap相关知识的总结(一)
    linux进阶之路(三):vi/vim编辑器
    linux进阶之路(二):linux文件目录
    linux进阶之路(一):linux入门
    linux:lrzsz安装
    一:阿里云服务器使用及后台环境搭建
    第二篇:线程七种状态
    Git log
    redis3.0 集群实战3
    详解Linux chgrp和chown命令的用法
  • 原文地址:https://www.cnblogs.com/linyuanzhou/p/6096939.html
Copyright © 2011-2022 走看看