C++分析——特殊容器STL使用

雨点打透心脏的1/2处 2022-05-28 13:49 288阅读 0赞
  • 排序容器sort

    • 使用默认排序比较
    • 使用自定义比较器比较
  • 乱序容器random_shuffle

排序容器sort

排序容器sort,将数组的元素从大到小或从小到达排序;
乱序容器random_shuffle,将数组的元素的顺序随机打乱,需要配合随机因子。

头文件:#include

使用默认排序比较

  1. std::vector<int> Value;
  2. Value.push_back(1);
  3. Value.push_back(3);
  4. Value.push_back(5);
  5. Value.push_back(7);
  6. Value.push_back(9);
  7. Value.push_back(6);
  8. Value.push_back(9);
  9. Value.push_back(2);
  10. Value.push_back(4);
  11. //默认从小到大排序
  12. std::sort(Value.begin(), Value.end());
  13. Show_info(Value);
  14. cout << "Next " << endl;
  15. //加入比较器,比较类型为int值,从大到小排序
  16. std::sort(Value.begin(), Value.end(),std::greater<int>());
  17. Show_info(Value);

执行结果

  1. $ ./project.o
  2. CSystem is called.
  3. int vertor info is 1
  4. int vertor info is 2
  5. int vertor info is 3
  6. int vertor info is 4
  7. int vertor info is 5
  8. int vertor info is 6
  9. int vertor info is 7
  10. int vertor info is 9
  11. int vertor info is 9
  12. Next
  13. int vertor info is 9
  14. int vertor info is 9
  15. int vertor info is 7
  16. int vertor info is 6
  17. int vertor info is 5
  18. int vertor info is 4
  19. int vertor info is 3
  20. int vertor info is 2
  21. int vertor info is 1

使用自定义比较器比较

通常,比较的类型不仅仅是值层面的比较,还需要类的比较,比较后将他们重新排序。这时候需定义类的比较器,并重载“<”和“>”号。

定义一个类,类成员函数有ID值和数值

  1. class CInfo
  2. {
  3. public:
  4. CInfo():index(0),m_number(0){}
  5. CInfo(int index_value,int number_value):index(index_value),m_number(number_value){}
  6. ~CInfo(){index = 0;m_number = 0;}
  7. void set_index(int value){ index = value;}
  8. int get_index(){
  9. return index;}
  10. void set_number(int value){ m_number = value;}
  11. int get_number(){
  12. return m_number;}
  13. //定义比较器比较大的值
  14. static bool Cmp(CInfo &origin_value,CInfo &cmp_calue)
  15. {
  16. return origin_value > cmp_calue;
  17. }
  18. //重载<
  19. bool operator<(CInfo &value)
  20. {
  21. return this->m_number < value.m_number;
  22. }
  23. //重载>
  24. bool operator>(CInfo &value)
  25. {
  26. return this->m_number > value.m_number;
  27. }
  28. //重载os输出 <<
  29. friend std::ostream& operator<< (std::ostream &os,CInfo &out)
  30. {
  31. os<< "Info index is " << out.index << " number is "<< out.m_number <<std::endl;
  32. return os;
  33. }
  34. //重载os输出 <<
  35. friend std::ostream& operator<<(std::ostream &os,std::vector<CInfo> &out)
  36. {
  37. std::vector<CInfo>::iterator iter = out.begin();
  38. while(iter != out.end())
  39. {
  40. os << *iter;
  41. iter++;
  42. }
  43. return os;
  44. }
  45. private:
  46. int index;
  47. int m_number;
  48. };

以及定义这个类的容器
std::vector Class_Value;

容器里面的值是在不同时期加进去的,里面顺序数值随机,此时需要根据类中成员变量m_number的值,对这个类的容器里面的值进行从大到小或从小到大排序。

测试源码:

  1. srand((unsigned)time(NULL));
  2. std::vector<CInfo> Class_Value;
  3. for(int i = 0;i < 10;i++)
  4. {
  5. //生成随机数
  6. CInfo info(rand()%10, rand()%100);
  7. Class_Value.push_back(info);
  8. }
  9. cout << Class_Value << endl;
  10. cout << "Sorting after ... " << endl;
  11. std::sort(Class_Value.begin(), Class_Value.end(),CInfo::Cmp);
  12. cout << Class_Value << endl;

执行结果

  1. $ ./project.o
  2. CSystem is called.
  3. Info index is 9 number is 56
  4. Info index is 6 number is 14
  5. Info index is 3 number is 97
  6. Info index is 8 number is 97
  7. Info index is 8 number is 67
  8. Info index is 5 number is 87
  9. Info index is 5 number is 51
  10. Info index is 7 number is 64
  11. Info index is 8 number is 67
  12. Info index is 3 number is 92
  13. "Sorting after ...
  14. Info index is 3 number is 97
  15. Info index is 8 number is 97
  16. Info index is 3 number is 92
  17. Info index is 5 number is 87
  18. Info index is 8 number is 67
  19. Info index is 8 number is 67
  20. Info index is 7 number is 64
  21. Info index is 9 number is 56
  22. Info index is 5 number is 51
  23. Info index is 6 number is 14

乱序容器random_shuffle

乱序容器是将容器内的成员随机打乱顺序,顺序的随机程度由随机种子决定。
头文件:#include

测试源码:

  1. //依据时间生成随机种子
  2. srand((unsigned)time(NULL));
  3. std::vector<int> Class_Value;
  4. for (int i = 0; i < 10; i++)
  5. {
  6. Class_Value.push_back(i);
  7. }
  8. cout << "random shuffle after ... " << endl;
  9. random_shuffle(Class_Value.begin(), Class_Value.end());
  10. std::vector<int>::iterator iter = Class_Value.begin();
  11. while (iter != Class_Value.end())
  12. {
  13. cout << "vector number is " << *iter << endl;
  14. iter++;
  15. }

执行结果

  1. $ ./project.o
  2. CSystem is called.
  3. random shuffle after ...
  4. vector number is 8
  5. vector number is 4
  6. vector number is 6
  7. vector number is 2
  8. vector number is 5
  9. vector number is 9
  10. vector number is 3
  11. vector number is 7
  12. vector number is 0
  13. vector number is 1

发表评论

表情:
评论列表 (有 0 条评论,288人围观)

还没有评论,来说两句吧...

相关阅读

    相关 C/C++编程:STL容器

    容器 有三类容器——顺序容器、关联容器和无序关联容器——每种都被设计为支持不同组的操作。 ![watermark_type_ZmFuZ3poZW5naGVpdGk_s

    相关 c++ 容器STL

    STL的代码从广义上讲分为三类:algorithm(算法)、container(容器)和iterator(迭代器),几乎所有的代码都采用了模板类和模版函数的方式,这相比于传统的