程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 練習使用 STL sort 對容器進行排序

練習使用 STL sort 對容器進行排序

編輯:C++入門知識

主要練習使用 std::sort 對 std::vector, std::string 等進行排序,並學習如何通過指定自定義排序方法或者重載 operator < 操作符等方式來自定義排序規則。 [cpp]   #include <string>   #include <vector>   #include <algorithm>   #include <functional>   #include <iostream>      struct Vec2D    {       float x;       float y;          Vec2D() : x(0.f), y(0.f)       {       }       Vec2D(float fx, float fy) : x(fx), y(fy)       {       }   };      std::ostream& operator << (std::ostream &out, const Vec2D &val)   {       return out<<"("<<val.x<<","<<val.y<<")";   }      struct Vec3D    {       float x;       float y;       float z;          Vec3D() :x(0.f), y(0.f), z(0.f)       {       }       Vec3D(float fx, float fy, float fz) : x(fx), y(fy), z(fz)       {       }          float length_squared() const       {           return x * x + y * y + z * z;       }       float length() const       {           return sqrtf(length_squared());       }          bool operator < (const Vec3D &rhs)       {           return length_squared() < rhs.length_squared();       }   };      std::ostream& operator << (std::ostream &out, const Vec3D &val)   {       return out<<"("<<val.x<<","<<val.y<<","<<val.z<<")";   }      template <class T>   void print_vector(const std::vector<T> &v)   {       using std::cout;       using std::endl;          for (std::vector<T>::const_iterator iter = v.begin(); iter != v.end(); ++iter)       {           cout<<(*iter)<<"\t";       }       cout<<endl;   }      // vector<int>排序方法,這裡按絕對值由小到大排序   static bool sort_comp_int(int elem1, int elem2)   {       return abs(elem1) < abs(elem2);   }      // vector<Vec2D>排序方法,這裡先按x由大到小排序,如果x相同再按y由小到大排序   static bool sort_comp_Vec2D(const Vec2D &elem1, const Vec2D &elem2)   {       if (elem1.x > elem2.x)           return true;       else if (elem1.x == elem2.x)           return elem1.y < elem2.y;          return false;   }      int main(int argc, char **argv)   {       using std::cout;       using std::cin;       using std::endl;          cout<<"========== sort std::vector<int> ==============="<<endl;          std::vector<int> vi;       vi.push_back(3);       vi.push_back(-4);       vi.push_back(1);       vi.push_back(5);          cout<<"before sort: "<<endl<<"\t";       print_vector<int>(vi);          // 使用默認的排序算法(operator <)由小到大排序       std::sort(vi.begin(), vi.end());       cout<<"sort default: "<<endl<<"\t";       print_vector<int>(vi);          // 使用 STL 提供的由大到小的排序算法       std::sort(vi.begin(), vi.end(), std::greater<int>());       cout<<"sort greater: "<<endl<<"\t";       print_vector<int>(vi);          // 使用自定義的排序算法       std::sort(vi.begin(), vi.end(), sort_comp_int);       cout<<"sort user defined: "<<endl<<"\t";       print_vector<int>(vi);          //////////////////////////////////////////////////////////////////////////          cout<<"========== sort std::string ==============="<<endl;          std::string s = "Hello, world!";          cout<<"before sort: "<<endl<<"\t";       cout<<s<<endl;          std::sort(s.begin(), s.end());       cout<<"sort default: "<<endl<<"\t";       cout<<s<<endl;          //////////////////////////////////////////////////////////////////////////          cout<<"========== sort std::vector<Vec2D> ==============="<<endl;          std::vector<Vec2D> v2;       v2.push_back(Vec2D(3.f, -1.f));       v2.push_back(Vec2D(1.f, 6.f));       v2.push_back(Vec2D(3.f, 3.2f));       v2.push_back(Vec2D(2.f, 0.f));              cout<<"before sort: "<<endl<<"\t";       print_vector<Vec2D>(v2);          // 使用自定義排序算法       std::sort(v2.begin(), v2.end(), sort_comp_Vec2D);       cout<<"sort user defined: "<<endl<<"\t";       print_vector<Vec2D>(v2);          //////////////////////////////////////////////////////////////////////////          cout<<"========== sort std::vector<Vec3D> ==============="<<endl;          std::vector<Vec3D> v3;       v3.push_back(Vec3D(1.f, 0.f, 0.f));       v3.push_back(Vec3D(1.f, 1.f, 1.f));       v3.push_back(Vec3D(0.f, 2.f, 0.f));       v3.push_back(Vec3D(0.f, 1.f, 1.f));          cout<<"before sort: "<<endl<<"\t";       print_vector<Vec3D>(v3);          // 默認的排序算法使用 operator < 作為排序方法       std::sort(v3.begin(), v3.end());       cout<<"sort operator <: "<<endl<<"\t";       print_vector<Vec3D>(v3);          cin.get();       return EXIT_SUCCESS;   }      輸出結果: [plain]   ========== sort std::vector<int> ===============   before sort:           3       -4      1       5   sort default:           -4      1       3       5   sort greater:           5       3       1       -4   sort user defined:           1       3       -4      5   ========== sort std::string ===============   before sort:           Hello, world!   sort default:            !,Hdellloorw   ========== sort std::vector<Vec2D> ===============   before sort:           (3,-1)  (1,6)   (3,3.2) (2,0)   sort user defined:  www.2cto.com         (3,-1)  (3,3.2) (2,0)   (1,6)   ========== sort std::vector<Vec3D> ===============   before sort:           (1,0,0) (1,1,1) (0,2,0) (0,1,1)   sort operator <:           (1,0,0) (0,1,1) (1,1,1) (0,2,0)      

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved