织梦CMS - 轻松建站从此开始!

罗索

std::vector针对结构成员的排序

jackyhwei 发布于 2010-09-17 22:30 点击:次 
std::vector排序问题,可将struct作为成员放进class,再利用重载实现排序,但这样的实现比较繁琐。其实,利用STL本身的排序算法,也是可以实现排序的。以下是实现代码,在VC2005下测试通过。
TAG:

std::vector排序问题,可将struct作为成员放进class,再利用重载实现排序,但这样的实现比较繁琐。其实,利用STL本身的排序算法,也是可以实现排序的。以下是实现代码,在VC2005下测试通过。注:2007-10-10修正两个bug。

  1. #include <Windows.h> 
  2. #include <tchar.h> 
  3. #include <iostream> 
  4. #include <vector> 
  5. #include <algorithm> 
  6.  
  7. struct TEST 
  8.      DWORD dwOne; 
  9.      DWORD dwTwo; 
  10. }; 
  11.  
  12. typedef std::vector<TEST> VECTOR; 
  13. typedef std::vector<TEST>::const_iterator ITER; 
  14.  
  15. bool pr1(const TEST &t1, const TEST &t2) 
  16.      return t1.dwOne < t2.dwOne; 
  17.  
  18. bool pr2(const TEST &t1, const TEST &t2) 
  19.      return t1.dwTwo < t2.dwTwo; 
  20.  
  21. void print(VECTOR &v) 
  22.      for (ITER iter = v.begin(); iter != v.end(); iter++) 
  23.      { 
  24.          std::cout << (*iter).dwOne << "-" << (*iter).dwTwo << '\t'
  25.      } 
  26.  
  27.      std::cout << std::endl; 
  28.  
  29. void push(TEST &t, VECTOR &v, DWORD dwOne, DWORD dwTwo) 
  30.      t.dwOne = dwOne; 
  31.      t.dwTwo = dwTwo; 
  32.      v.push_back(t); 
  33.  
  34. int main() 
  35.      TEST t; 
  36.      VECTOR v; 
  37.      push(t, v, 1, 18); 
  38.      push(t, v, 2, 8); 
  39.      push(t, v, 0, 3); 
  40.      push(t, v, 2, 1); 
  41.      push(t, v, 1, 1); 
  42.      push(t, v, 0, 22); 
  43.      push(t, v, 2, 0); 
  44.      push(t, v, 0, 1); 
  45.      push(t, v, 1, 6); 
  46.      push(t, v, 0, 8); 
  47.  
  48.      print(v); 
  49.  
  50.      sort(v.begin(), v.end(), pr1); 
  51.      print(v); 
  52.  
  53.      size_t m, n; 
  54.  
  55.      m = n = 0; 
  56.      for (ITER iter=v.begin();iter!=v.end()&&(*iter).dwOne!=0; ++iter)
  57. m++; 
  58.      for (ITER iter=v.end();iter!=v.begin()&&(*(iter-1)).dwOne!=0;--iter)
  59. n++; 
  60.      if (m != v.size()) sort(v.begin() + m, v.end() - n, pr2); 
  61. print(v); 
  62.  
  63.      m = n = 0; 
  64.      for (ITER iter=v.begin();iter!=v.end()&&(*iter).dwOne!=1;++iter)
  65. m++; 
  66.      for (ITER iter=v.end();iter!=v.begin()&&(*(iter-1)).dwOne!=1;--iter)
  67. n++; 
  68.      if (m != v.size()) sort(v.begin() + m, v.end() - n, pr2); 
  69. print(v); 
  70.  
  71.      m = n = 0; 
  72.      for (ITER iter=v.begin();iter!=v.end()&&(*iter).dwOne!=2;++iter)
  73. m++; 
  74.      for (ITER iter=v.end();iter!=v.begin()&&(*(iter-1)).dwOne!=2;--iter)
  75. n++; 
  76.      if (m != v.size()) sort(v.begin() + m, v.end() - n, pr2); 
  77.      print(v); 
  78.  
  79.      return 0; 

执行结果:

  1. 1-18     2-8     0-3     2-1     1-1     0-22     2-0     0-1     1-6     0-8 
  2.  
  3. 0-3     0-22     0-1     0-8     1-18     1-1     1-6     2-8     2-1     2-0 
  4.  
  5. 0-1     0-3     0-8     0-22     1-18     1-1     1-6     2-8     2-1     2-0 
  6.  
  7. 0-1     0-3     0-8     0-22     1-1     1-6     1-18     2-8     2-1     2-0 
  8.  
  9. 0-1     0-3     0-8     0-22     1-1     1-6     1-18     2-0     2-1     2-8 

 

(pascal4)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201009/10179.html]
本文出处:百度博客 作者:pascal4
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容