当前位置:   article > 正文

c++各种容器排序_c++自动排序的容器

c++自动排序的容器

1.vector容器(仿函数排序)

  1. class MyCompare
  2. {
  3. public:
  4. bool operator()(int num1, int num2)
  5. {
  6. return num1 > num2;
  7. }
  8. };
  9. void test01()
  10. {
  11. vector<int> v;
  12. v.push_back(10);
  13. v.push_back(40);
  14. v.push_back(20);
  15. v.push_back(30);
  16. v.push_back(50);
  17. //默认从小到大
  18. sort(v.begin(), v.end());
  19. //使用函数对象改变算法策略,排序从大到小
  20. sort(v.begin(), v.end(), MyCompare());
  21. for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
  22. {
  23. cout << *it << " ";
  24. }
  25. cout << endl;
  26. }
  27. int main() {
  28. test01();
  29. system("pause");
  30. return 0;
  31. }

小结:deque容器和vector容器排序用法一样,因为都支持随机访问。例如:sort(v.begin(), v.end());

2.list容器

  1. void printList(const list<int>& L) {
  2. for (list<int>::const_iterator it = L.begin(); it != L.end(); it++) {
  3. cout << *it << " ";
  4. }
  5. cout << endl;
  6. }
  7. bool myCompare(int val1 , int val2)
  8. {
  9. return val1 > val2;
  10. }
  11. //反转和排序
  12. void test01()
  13. {
  14. list<int> L;
  15. L.push_back(90);
  16. L.push_back(30);
  17. L.push_back(20);
  18. L.push_back(70);
  19. printList(L);
  20. //反转容器的元素
  21. L.reverse();
  22. printList(L);
  23. //排序
  24. L.sort(); //默认的排序规则 从小到大
  25. printList(L);
  26. L.sort(myCompare); //指定规则,从大到小
  27. printList(L);
  28. }
  29. int main() {
  30. test01();
  31. system("pause");
  32. return 0;
  33. }

 小结:list不支持随机访问,用sort前,需要指定具体容器。例如L.sort()

3.set存放内置数据类型排序

  1. class MyCompare
  2. {
  3. public:
  4. bool operator()(int v1, int v2) {
  5. return v1 > v2;
  6. }
  7. };
  8. void test01()
  9. {
  10. set<int> s1;
  11. s1.insert(10);
  12. s1.insert(40);
  13. s1.insert(20);
  14. s1.insert(30);
  15. s1.insert(50);
  16. //默认从小到大
  17. for (set<int>::iterator it = s1.begin(); it != s1.end(); it++) {
  18. cout << *it << " ";
  19. }
  20. cout << endl;
  21. //指定排序规则
  22. set<int,MyCompare> s2;
  23. s2.insert(10);
  24. s2.insert(40);
  25. s2.insert(20);
  26. s2.insert(30);
  27. s2.insert(50);
  28. for (set<int, MyCompare>::iterator it = s2.begin(); it != s2.end(); it++) {
  29. cout << *it << " ";
  30. }
  31. cout << endl;
  32. }
  33. int main() {
  34. test01();
  35. system("pause");
  36. return 0;
  37. }

小结:set容器本身就默认从小到大排序,更改排序规则需要利用仿函数MyCompare。

特别注意三点:

(1)声明定义仿函数class MyCompare 

(2)定义容器set<int,MyCompare> s2;

(3)遍历容器:for (set<int, MyCompare>::iterator it = s2.begin(); it != s2.end(); it++) 

4.set容器自定义类按指定变量排序

  1. class Person
  2. {
  3. public:
  4. Person(string name, int age)
  5. {
  6. this->m_Name = name;
  7. this->m_Age = age;
  8. }
  9. string m_Name;
  10. int m_Age;
  11. };
  12. class comparePerson
  13. {
  14. public:
  15. bool operator()(const Person& p1, const Person &p2)
  16. {
  17. //按照年龄进行排序 降序
  18. return p1.m_Age > p2.m_Age;
  19. }
  20. };
  21. void test01()
  22. {
  23. set<Person, comparePerson> s;
  24. Person p1("刘备", 23);
  25. Person p2("关羽", 27);
  26. Person p3("张飞", 25);
  27. Person p4("赵云", 21);
  28. s.insert(p1);
  29. s.insert(p2);
  30. s.insert(p3);
  31. s.insert(p4);
  32. for (set<Person, comparePerson>::iterator it = s.begin(); it != s.end(); it++)
  33. {
  34. cout << "姓名: " << it->m_Name << " 年龄: " << it->m_Age << endl;
  35. }
  36. }
  37. int main() {
  38. test01();
  39. system("pause");
  40. return 0;
  41. }

5.map存放内置数据类型排序

  1. class MyCompare {
  2. public:
  3. bool operator()(int v1, int v2) {
  4. return v1 > v2;
  5. }
  6. };
  7. void test01()
  8. {
  9. //默认从小到大排序
  10. //利用仿函数实现从大到小排序
  11. map<int, int, MyCompare> m;
  12. m.insert(make_pair(1, 10));
  13. m.insert(make_pair(2, 20));
  14. m.insert(make_pair(3, 30));
  15. m.insert(make_pair(4, 40));
  16. m.insert(make_pair(5, 50));
  17. for (map<int, int, MyCompare>::iterator it = m.begin(); it != m.end(); it++) {
  18. cout << "key:" << it->first << " value:" << it->second << endl;
  19. }
  20. }
  21. int main() {
  22. test01();
  23. system("pause");
  24. return 0;
  25. }

6.map容器自定义类按指定变量排序

  1. #include<iostream>
  2. using namespace std;
  3. #include <map>
  4. #include <string>
  5. class Person
  6. {
  7. public:
  8. Person(string name, int age, int height)
  9. {
  10. this->m_Name = name;
  11. this->m_Age = age;
  12. this->m_Height = height;
  13. }
  14. string m_Name;
  15. int m_Age;
  16. int m_Height;
  17. };
  18. class Wife{
  19. public:
  20. Wife(string wname, int wage)
  21. {
  22. this->w_Name = wname;
  23. this->w_Age = wage;
  24. }
  25. string w_Name;
  26. int w_Age;
  27. };
  28. class comparePerson
  29. {
  30. public:
  31. bool operator()(const Person& p1, const Person& p2)
  32. {
  33. if (p1.m_Age == p2.m_Age)
  34. {
  35. return p1.m_Height > p2.m_Height;
  36. }
  37. return p1.m_Age < p2.m_Age;
  38. }
  39. };
  40. void myprint(map<Person, Wife, comparePerson>&m)
  41. {
  42. for (map<Person, Wife, comparePerson>::iterator it = m.begin(); it != m.end(); it++)
  43. {
  44. cout << "\t姓名:" << it->first.m_Name << "\t年龄:" << it->first.m_Age
  45. << "\t身高:" << it->first.m_Height << "\t妻子:" << it->second.w_Name
  46. << "\t年龄:" << it->second.w_Age
  47. << endl;
  48. }
  49. }
  50. void test01() {
  51. map<Person,Wife,comparePerson>m;
  52. Person p1("刘备", 35, 175);
  53. Person p2("曹操", 45, 180);
  54. Person p3("孙权", 40, 170);
  55. Person p4("赵云", 25, 190);
  56. Person p5("张飞", 35, 160);
  57. Person p6("关羽", 35, 200);
  58. Wife w1("张三",23);
  59. Wife w2("李四",24);
  60. Wife w3("王五",25);
  61. Wife w4("马六",26);
  62. Wife w5("赵七",27);
  63. Wife w6("老八",28);
  64. m.insert(pair<Person,Wife>(p1, w1));
  65. m.insert(pair<Person,Wife>(p2, w2));
  66. m.insert(pair<Person,Wife>(p3, w3));
  67. m.insert(pair<Person,Wife>(p4, w4));
  68. m.insert(pair<Person,Wife>(p5, w5));
  69. m.insert(pair<Person,Wife>(p6, w6));
  70. myprint(m);
  71. }
  72. int main() {
  73. test01();
  74. system("pause");
  75. return 0;
  76. }

小结:map容器排序和 set相似。

特别注意三点:

(1)容器的声明和遍历时,多了一个参数,也就是3个参数,因为他是以对组的形式存在。

(2)遍历容器输出内容时,注意想要输入的第一个Person还是第二个Wife。

cout << "\t姓名:" << it->first.m_Name << "\t年龄:" << it->first.m_Age
            << "\t身高:" << it->first.m_Height << "\t妻子:" << it->second.w_Name
            << "\t年龄:" << it->second.w_Age
            << endl;

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/528983
推荐阅读
相关标签
  

闽ICP备14008679号