std::vector排序问题,可将struct作为成员放进class,再利用重载实现排序,但这样的实现比较繁琐。其实,利用STL本身的排序算法,也是可以实现排序的。以下是实现代码,在VC2005下测试通过。注:2007-10-10修正两个bug。
- #include <Windows.h>
- #include <tchar.h>
- #include <iostream>
- #include <vector>
- #include <algorithm>
-
- struct TEST
- {
- DWORD dwOne;
- DWORD dwTwo;
- };
-
- typedef std::vector<TEST> VECTOR;
- typedef std::vector<TEST>::const_iterator ITER;
-
- bool pr1(const TEST &t1, const TEST &t2)
- {
- return t1.dwOne < t2.dwOne;
- }
-
- bool pr2(const TEST &t1, const TEST &t2)
- {
- return t1.dwTwo < t2.dwTwo;
- }
-
- void print(VECTOR &v)
- {
- for (ITER iter = v.begin(); iter != v.end(); iter++)
- {
- std::cout << (*iter).dwOne << "-" << (*iter).dwTwo << '\t';
- }
-
- std::cout << std::endl;
- }
-
- void push(TEST &t, VECTOR &v, DWORD dwOne, DWORD dwTwo)
- {
- t.dwOne = dwOne;
- t.dwTwo = dwTwo;
- v.push_back(t);
- }
-
- int main()
- {
- TEST t;
- VECTOR v;
- push(t, v, 1, 18);
- push(t, v, 2, 8);
- push(t, v, 0, 3);
- push(t, v, 2, 1);
- push(t, v, 1, 1);
- push(t, v, 0, 22);
- push(t, v, 2, 0);
- push(t, v, 0, 1);
- push(t, v, 1, 6);
- push(t, v, 0, 8);
-
- print(v);
-
- sort(v.begin(), v.end(), pr1);
- print(v);
-
- size_t m, n;
-
- m = n = 0;
- for (ITER iter=v.begin();iter!=v.end()&&(*iter).dwOne!=0; ++iter)
- m++;
- for (ITER iter=v.end();iter!=v.begin()&&(*(iter-1)).dwOne!=0;--iter)
- n++;
- if (m != v.size()) sort(v.begin() + m, v.end() - n, pr2);
- print(v);
-
- m = n = 0;
- for (ITER iter=v.begin();iter!=v.end()&&(*iter).dwOne!=1;++iter)
- m++;
- for (ITER iter=v.end();iter!=v.begin()&&(*(iter-1)).dwOne!=1;--iter)
- n++;
- if (m != v.size()) sort(v.begin() + m, v.end() - n, pr2);
- print(v);
-
- m = n = 0;
- for (ITER iter=v.begin();iter!=v.end()&&(*iter).dwOne!=2;++iter)
- m++;
- for (ITER iter=v.end();iter!=v.begin()&&(*(iter-1)).dwOne!=2;--iter)
- n++;
- if (m != v.size()) sort(v.begin() + m, v.end() - n, pr2);
- print(v);
-
- return 0;
- }
执行结果:
- 1-18 2-8 0-3 2-1 1-1 0-22 2-0 0-1 1-6 0-8
-
- 0-3 0-22 0-1 0-8 1-18 1-1 1-6 2-8 2-1 2-0
-
- 0-1 0-3 0-8 0-22 1-18 1-1 1-6 2-8 2-1 2-0
-
- 0-1 0-3 0-8 0-22 1-1 1-6 1-18 2-8 2-1 2-0
-
- 0-1 0-3 0-8 0-22 1-1 1-6 1-18 2-0 2-1 2-8
(pascal4) |