• C++学习笔记(三十一)


    在完成对C语言的学习后,我最近开始了对C++和Java的学习,目前跟着视频学习了一些语法,也跟着敲了一些代码,有了一定的掌握程度。现在将跟着视频做的笔记进行整理。本篇博客是整理C++知识点的第三十一篇博客。

    本篇博客介绍了C++的常用排序算法,常用拷贝和替换算法,常用算数生成算法,常用集合算法。

    本系列博客所有C++代码都在Visual Studio 2022环境下编译运行。程序为64位。

    目录

    常用排序算法

    sort

    random_shuffle

    merge

    reverse

    常用拷贝和替换算法

    copy

    replace

    replace_if

    swap

    常用算数生成算法

    accumulate

    fill

    常用集合算法

    set_intersection

    set_union

    set_difference


    常用排序算法

    使用排序算法需要包含头文件algorithm

    sort

    sort对容器内元素进行排序。函数原型是:

    sort(iterator beg,iterator end,pred)

    beg是开始位置,end是结束位置,pred是谓词。

    1. #include
    2. #include
    3. #include
    4. #include
    5. using namespace std;
    6. void print(int num)
    7. {
    8. cout << num << " ";
    9. }
    10. int main(void)
    11. {
    12. vector<int> v;
    13. v.push_back(20);
    14. v.push_back(50);
    15. v.push_back(40);
    16. v.push_back(10);
    17. v.push_back(30);
    18. sort(v.begin(), v.end());
    19. for_each(v.begin(), v.end(), print);
    20. cout << endl;
    21. sort(v.begin(), v.end(), greater<int>());
    22. for_each(v.begin(), v.end(), print);
    23. cout << endl;
    24. return 0;
    25. }

    程序的输出是:

    10   20   30   40   50
    50   40   30   20   10

    random_shuffle

    random_shuffle进行洗牌,将指定范围内的元素随机调整次序。函数的原型是:

    random_shuffle(iterator beg,iterator end)

    将beg到end的元素进行洗牌。为了完全打乱,并使得顺序更随机,需要加入随机数种子。

    1. #include
    2. #include
    3. #include
    4. #include
    5. using namespace std;
    6. void print(int num)
    7. {
    8. cout << num << " ";
    9. }
    10. int main(void)
    11. {
    12. srand((unsigned int)time(NULL));
    13. vector<int> v;
    14. int i;
    15. for (i = 1; i <= 10; i += 1) {
    16. v.push_back(i);
    17. }
    18. for_each(v.begin(), v.end(), print);
    19. cout << endl;
    20. random_shuffle(v.begin(), v.end());
    21. for_each(v.begin(), v.end(), print);
    22. cout << endl;
    23. return 0;
    24. }

    程序的输出是:

    1   2   3   4   5   6   7   8   9   10
    8   4   2   5   10   7   3   1   6   9

    merge

    merge将两个容器元素合并,并存储到另一个容器中,两个容器必须是有序的。函数原型是:

    merge(iterator beg1,iterator end1,iterator beg2,iterator end2,iterator dest)

    beg1是第一个容器的开始位置,end1是第一个容器的结束位置。beg2是第二个容器的开始位置,end2是第二个容器的结束位置。dest是目的容器的开始位置(目的容器需要预留足够的空间)。

    1. #include
    2. #include
    3. #include
    4. using namespace std;
    5. void print(int num) {
    6. cout << num << " ";
    7. }
    8. int main(void)
    9. {
    10. vector<int> v1;
    11. vector<int> v2;
    12. vector<int> v3;
    13. int i;
    14. for (i = 1; i <= 10; i += 1) {
    15. v1.push_back(i);
    16. v2.push_back(i + 5);
    17. }
    18. for_each(v1.begin(), v1.end(), print);
    19. cout << endl;
    20. for_each(v2.begin(), v2.end(), print);
    21. cout << endl;
    22. v3.resize(v1.size() + v2.size());
    23. merge(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.begin());
    24. for_each(v3.begin(), v3.end(), print);
    25. cout << endl;
    26. return 0;
    27. }

    程序的输出是:

    1   2   3   4   5   6   7   8   9   10
    6   7   8   9   10   11   12   13   14   15
    1   2   3   4   5   6   6   7   7   8   8   9   9   10   10   11   12   13   14   15

    reverse

    reverse将容器内的元素进行反转。函数原型是:

    reverse(iterator beg,iterator end)

    beg是开始迭代器,end是结束迭代器。

    1. #include
    2. #include
    3. #include
    4. using namespace std;
    5. void print(int num) {
    6. cout << num << " ";
    7. }
    8. int main(void)
    9. {
    10. vector<int> v;
    11. v.push_back(10);
    12. v.push_back(30);
    13. v.push_back(50);
    14. v.push_back(20);
    15. v.push_back(40);
    16. for_each(v.begin(), v.end(), print);
    17. cout << endl;
    18. reverse(v.begin(), v.end());
    19. for_each(v.begin(), v.end(), print);
    20. cout << endl;
    21. return 0;
    22. }

    程序的输出是:

    10   30   50   20   40
    40   20   50   30   10
     

    常用拷贝和替换算法

    使用这些算法需要包含头文件algorithm

    copy

    copy将容器内指定范围的元素拷贝到另一个容器中。函数原型是:

    copy(iterator beg,iterator end,iterator dest)

    beg是源容器开始位置,end是源容器结束位置,dest是目标开始地址。同样需要提前分配空间。

    1. #include
    2. #include
    3. #include
    4. using namespace std;
    5. void print(int num)
    6. {
    7. cout << num << " ";
    8. }
    9. int main(void)
    10. {
    11. vector<int> v1;
    12. int i;
    13. for (i = 1; i <= 10; i += 1) {
    14. v1.push_back(i);
    15. }
    16. vector<int> v2;
    17. v2.resize(v1.size());
    18. copy(v1.begin(), v1.end(), v2.begin());
    19. for_each(v2.begin(), v2.end(), print);
    20. return 0;
    21. }

    程序的输出是:

    1   2   3   4   5   6   7   8   9   10

    replace

    replace将容器内指定范围的旧元素修改为新元素。函数原型是:

    replace(iterator beg,iterator end,oldvalue,newvalue)

    beg是开始位置,end是结束位置,oldvalue是旧元素,newvalue是新元素。

    1. #include
    2. #include
    3. #include
    4. using namespace std;
    5. void print(int num)
    6. {
    7. cout << num << " ";
    8. }
    9. int main(void)
    10. {
    11. vector<int> v;
    12. v.push_back(10);
    13. v.push_back(20);
    14. v.push_back(30);
    15. v.push_back(40);
    16. v.push_back(20);
    17. v.push_back(20);
    18. v.push_back(50);
    19. for_each(v.begin(), v.end(), print);
    20. cout << endl;
    21. replace(v.begin(), v.end(), 20, 25);
    22. for_each(v.begin(), v.end(), print);
    23. cout << endl;
    24. return 0;
    25. }

    程序的输出是:

    10   20   30   40   20   20   50
    10   25   30   40   25   25   50

    程序将20换成了25。

    replace_if

    replace_if将区间内满足条件的元素替换成指定元素。函数原型是:

    replace_if(iterator beg,iterator end,pred,newvalue)

    beg是开始位置,end是结束位置,pred是一个谓词,newvalue是新元素。

    1. #include
    2. #include
    3. #include
    4. using namespace std;
    5. void print(int num)
    6. {
    7. cout << num << " ";
    8. }
    9. class compare
    10. {
    11. public:
    12. bool operator() (int num) {
    13. return num > 30;
    14. }
    15. };
    16. int main(void)
    17. {
    18. vector<int> v;
    19. v.push_back(20);
    20. v.push_back(30);
    21. v.push_back(40);
    22. v.push_back(50);
    23. v.push_back(60);
    24. v.push_back(10);
    25. for_each(v.begin(), v.end(), print);
    26. cout << endl;
    27. replace_if(v.begin(), v.end(), compare(), 55);
    28. for_each(v.begin(), v.end(), print);
    29. cout << endl;
    30. return 0;
    31. }

    程序的输出是:

    20   30   40   50   60   10
    20   30   55   55   55   10

    程序将大于30的元素全部换为55。

    swap

    swap互换两个容器的元素。函数原型是:

    swap(container c1,container c2)

    交换c1和c2的元素。

    1. #include
    2. #include
    3. #include
    4. using namespace std;
    5. void print(int num)
    6. {
    7. cout << num << " ";
    8. }
    9. int main(void)
    10. {
    11. vector<int> v1;
    12. vector<int> v2;
    13. int i;
    14. for (i = 1; i <= 10; i += 1) {
    15. v1.push_back(i);
    16. v2.push_back(i + 100);
    17. }
    18. for_each(v1.begin(), v1.end(), print);
    19. cout << endl;
    20. for_each(v2.begin(), v2.end(), print);
    21. cout << endl;
    22. swap(v1,v2);
    23. for_each(v1.begin(), v1.end(), print);
    24. cout << endl;
    25. for_each(v2.begin(), v2.end(), print);
    26. cout << endl;
    27. return 0;
    28. }

    程序的输出是:

    1   2   3   4   5   6   7   8   9   10
    101   102   103   104   105   106   107   108   109   110
    101   102   103   104   105   106   107   108   109   110
    1   2   3   4   5   6   7   8   9   10

    常用算数生成算法

    常用算数生成算法使用时包含的头文件是numeric

    accumulate

    accumulate计算区间内容器元素累计总和。函数原型是:

    accumulate(iterator beg,iterator end,value)

    beg是起始位置,end是结束位置,value是起始值。

    1. #include
    2. #include
    3. #include
    4. using namespace std;
    5. int main(void)
    6. {
    7. vector<int> v;
    8. int i;
    9. for (i = 1; i <= 100; i += 1) {
    10. v.push_back(i);
    11. }
    12. cout << accumulate(v.begin(), v.end(), 0) << endl;
    13. return 0;
    14. }

    这段程序进行相加时从0开始。程序的输出是:

    5050

    fill

    fill向容器中填充指定的元素,函数原型是:

    fill(iterator beg,iterator end,value)

    beg表示开始,end表示结束,value是要填充的值。

    1. #include
    2. #include
    3. #include
    4. #include
    5. using namespace std;
    6. void print(int num)
    7. {
    8. cout << num << " ";
    9. }
    10. int main(void)
    11. {
    12. vector<int> v;
    13. v.resize(10);
    14. fill(v.begin(), v.end(), 100);
    15. for_each(v.begin(), v.end(), print);
    16. return 0;
    17. }

    程序的输出是:

    100   100   100   100   100   100   100   100   100   100

    容器最初预留了10个空间,没有填充值,随后全部填充为100。

    常用集合算法

    使用常用集合算法需要包含头文件algorithm

    set_intersection

    set_intersection用于求两个容器的交集。函数原型是:

    set_intersection(iterator beg1,iterator end1,iterator beg2,iterator end2,iterator dest)

    beg1是容器1开始迭代器,end1是容器1结束迭代器,beg2是容器2开始迭代器,end2是容器2结束迭代器。dest是目标容器开始迭代器。返回最后一个元素位置。两个容器必须有序。

    要开辟足够的空间,两个容器交集的大小不大于两个容器的较小的大小。

    1. #include
    2. #include
    3. #include
    4. using namespace std;
    5. void print(int num)
    6. {
    7. cout << num << " ";
    8. }
    9. int main(void)
    10. {
    11. vector<int> v1;
    12. vector<int> v2;
    13. int i;
    14. for (i = 1; i <= 10; i += 1) {
    15. v1.push_back(i);
    16. v2.push_back(i + 5);
    17. }
    18. vector<int> v3;
    19. v3.resize(min(v1.size(), v2.size()));
    20. vector<int>::iterator end = set_intersection(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.begin());
    21. for_each(v3.begin(), end, print);
    22. cout << endl;
    23. return 0;
    24. }

    程序的输出是:

    6   7   8   9   10

    set_union

    set_union求两个容器的并集,函数原型是:

    set_union(iterator beg1,iterator end1,iterator beg2,iterator end2,iterator dest)

    beg1是容器1开始迭代器,end1是容器1结束迭代器,beg2是容器2开始迭代器,end2是容器2结束迭代器。dest是目标容器开始迭代器。返回最后一个元素位置。两个容器必须有序。

    要开辟足够的空间,两个容器并集的大小不大于两个容器的大小之和。

    1. #include
    2. #include
    3. #include
    4. using namespace std;
    5. void print(int num)
    6. {
    7. cout << num << " ";
    8. }
    9. int main(void)
    10. {
    11. vector<int> v1;
    12. vector<int> v2;
    13. int i;
    14. for (i = 1; i <= 10; i += 1) {
    15. v1.push_back(i);
    16. v2.push_back(i + 5);
    17. }
    18. vector<int> v3;
    19. v3.resize(v1.size() + v2.size());
    20. vector<int>::iterator end = set_union(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.begin());
    21. for_each(v3.begin(), end, print);
    22. return 0;
    23. }

    程序的输出是:

    1   2   3   4   5   6   7   8   9   10   11   12   13   14   15

    set_difference

    set_difference求两个集合的差集。函数原型是:

    set_difference(iterator beg1,iterator end1,iterator beg2,iterator end2,iterator dest)

    beg1是容器1开始迭代器,end1是容器1结束迭代器,beg2是容器2开始迭代器,end2是容器2结束迭代器。dest是目标容器开始迭代器。返回最后一个元素位置。两个容器必须有序。

    要开辟足够的空间,两个容器差集的大小不大于两个容器中较大的大小。

    1. #include
    2. #include
    3. #include
    4. using namespace std;
    5. void print(int num)
    6. {
    7. cout << num << " ";
    8. }
    9. int main(void)
    10. {
    11. vector<int> v1;
    12. vector<int> v2;
    13. int i;
    14. for (i = 1; i <= 10; i += 1) {
    15. v1.push_back(i);
    16. v2.push_back(i + 5);
    17. }
    18. vector<int> v3;
    19. vector<int> v4;
    20. v3.resize(max(v1.size(), v2.size()));
    21. v4.resize(max(v1.size(), v2.size()));
    22. vector<int>::iterator end3 = set_difference(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.begin());
    23. for_each(v3.begin(), end3, print);
    24. cout << endl;
    25. vector<int>::iterator end4 = set_difference(v2.begin(), v2.end(), v1.begin(), v1.end(), v4.begin());
    26. for_each(v4.begin(), end4, print);
    27. cout << endl;
    28. return 0;
    29. }

    程序的输出是:

    1   2   3   4   5
    11   12   13   14   15
     

  • 相关阅读:
    pdd.order.list.get拼多多店铺订单列表查询接口(拼多多店铺订单详情接口,订单明文接口,订单解密接口,订单插旗接口,订单备注接口)代码对接教程
    C. Beautiful Sets of Points(找规律&杂题)
    【新品发布】原来做多用途(室内、室外)无人机开发还能用它——P450进阶版
    计算机视觉基础(8)——齐次坐标系与相机内外参
    2023版 STM32实战2 按键驱动(电路与代码都讲解)
    MySQL隔离性实现原理
    行业沙龙第一期丨汽配供应链业务的解痛之道与数字化未来
    哪种品牌台灯适合学生用?盘点学生护眼台灯十大牌子
    MMORPG网络游戏开发之任务系统的架构与设计
    DataFunSummit 2023:洞察现代数据栈技术的创新与发展(附大会核心PPT下载)
  • 原文地址:https://blog.csdn.net/m0_71007572/article/details/126442927