C++STL算法篇之排序和通用算法

简介: C++STL算法篇之排序和通用算法

使用算法的时候,包含的头文件

functional和algorithm

排序的准则

默认的排序准则

1.less<类型>() 从小到大

greater<类型>() 从大到小

2.如果想要自定义排序的准则

可以通过仿函数,lambda表达式,函数适配器来实现**

sort排序

默认的是从小到大排序

#include<iostream>
#include<functional>
#include<algorithm>
#include<string>
#include<vector>
using namespace std;
int main()
{
  //1.sort排序
  vector<int> m = { 3,5, 6, 0, 1, 3, 7, 5, 3 };
  sort(m.begin(), m.end());
  sort(m.begin(), m.end(), less<int>()); //默认从小到大排序
  copy(m.begin(), m.end(), ostream_iterator<int>(cout, " ")); //流的方式打印数据
  cout << endl;
  sort(m.begin(), m.end(), greater<int>());
  copy(m.begin(), m.end(), ostream_iterator<int>(cout, " "));
  return 0;
}

注意:链表的排序不能使用sort算法,因为链表不是连续的,对于链表的排序可以调用内置的sort算法

stable_sort(保持相对顺序的排序)

使用lambda表达式和强制类型转换

以及copy函数打印

//2 stable_sort.
  //保持相对顺序的排序
  //一般使用double类型的数据
  vector<double> m1 = { 1.11, 5.23, 3.23, 7.89, 5.21, 9.99, 11.1, 2.22, 2.23 };
  stable_sort(m1.begin(), m1.end(), [](double a, double b) {return int(a) < int(b); }); //double类型用整形的类型来比较
  copy(m1.begin(), m1.end(), ostream_iterator<double>(cout, " "));

merge(归并排序)

不改变原容器的数据

有5个参数,实际上就是将2个有序的数组,合并成一个有序的数组,如果你会归并排序,那么就对此不陌生

前2个参数,表示第一个有序数组的范围

后面2个参数表示第二个有序数组的范围

最后一个参数表示数据打印的位置

//3.merge 归并排序
vector<int> m3 = { 1, 2, 4, 5, 0,4, 6, 7 };
  vector<int> result(m3.size());
  merge(m3.begin(), m3.begin() + 4, m3.begin() + 4, m3.end(), result.begin());
  copy(result.begin(), result.end(), ostream_iterator<int>(cout, " "));

inplace_merge(归并排序)

直接作用到原容器上面

//4.inplace_merge(直接作用到原容器上面)
  vector<int> m5 = { 1, 2, 4, 5, 0,4, 6, 7 };
  inplace_merge(m5.begin(), m5.begin() + 4, m5.end());
  copy(m5.begin(), m5.end(), ostream_iterator<int>(cout, " "));

nth_element(关键字排序)

实际上就理解成一种特殊的排序方式,结果其实跟归并排序貌似一样

//5.nth_element(关键字排序)
vector<int> m6 = { 1, 2, 4, 5, 0,4, 6, 7 };
  nth_element(m6.begin(), m6.begin() + 4, m6.end());
  copy(m6.begin(), m6.end(), ostream_iterator<int>(cout, " "));

partition

分类处理,按特定的条件把数据分为2组

/6.分类处理 partition
  vector<int> date = { 1, 3, 5, 7, 9, 0, 2, 4, 5 };
  partition(date.begin(), date.end(), [](int a) {return a< 6; });
  copy(date.begin(), date.end(), ostream_iterator<int>(cout, " ")); 
  //小于6的放到左边,大于6的放到右边

stable_partition

保持数据相对顺序,分类处理

一般是浮点数

//7.保持数据的相对稳定 一般用于浮点数
  //stable_partition
  vector<double> date1 = { 1.2, 0.3, 0.1, 2.4, 1.9, 6.9, 4.5 };
  stable_partition(date1.begin(), date1.end(), [](double a) {return int(a) < 2; });
  copy(date1.begin(), date1.end(),ostream_iterator<double>(cout, " "));

partial_sort(局部排序)

partial_sort_copy

局部排序的结果放到新的容器里

//9.局部排序结果另存 partial_sort_copy
  vector<int> mmm1 = { 1, 4, 4, 3, 2 };
  vector<int> result1(2);
  partial_sort_copy(mmm1.begin(), mmm1.begin() + 2, result1.begin(), result1.end());
  copy(result1.begin(), result1.end(), ostream_iterator<int>(cout, " "));

random_shuffle

乱序算法

注意:这里乱序算法一般搭配随机数种子使用,不然的话,每次出现的结果是一样的

//10.乱序算法 random_shuffle
  //随机数种子
  srand((unsigned)time(nullptr));
  vector<int> mmm2 = { 1, 2 ,3, 4, 5, 6, 7, 8, 9 };
  random_shuffle(mmm2.begin(), mmm2.end());
  copy(mmm2.begin(), mmm2.end(), ostream_iterator<int>(cout, " "));

reverse(逆置)

//11.逆置 reserve
  string str1 = "I love you";
  reverse(str1.begin(), str1.end());
  cout << str1 << endl;

reverse_copy( 逆置另存)

注意:另存的容器都要定义大小,刚定义是没有空间,不然就会出现越界问题

//12.逆置另存  reverse_copy
  string str2 = "ABCDEFG";
  string str3;
  str3.resize(77); //创建空间大
  reverse_copy(str2.begin(), str2.end(), str3.begin());
  cout << str3 << endl;

rotate(移动元素到末尾)

//13.移动元素到末尾 rotate
  string str4 = "ABCDEF";
  rotate(str4.begin(), str4.begin() + 2, str4.end());
  cout << str4 << endl;
  //将前2个元素 移到末尾

rotate_copy

移动元素到末尾结果另存

//14.移动元素到末尾另存 rotate_copy
  string str5 = "ABCDEFGHIJK";
  string str6;
  str6.resize(str5.size());
  rotate_copy(str5.begin(), str5.begin() + 4, str5.end(), str6.begin());
  cout << str6 << endl;


相关文章
|
14天前
|
存储 编译器 C语言
【c++丨STL】vector的使用
本文介绍了C++ STL中的`vector`容器,包括其基本概念、主要接口及其使用方法。`vector`是一种动态数组,能够根据需要自动调整大小,提供了丰富的操作接口,如增删查改等。文章详细解释了`vector`的构造函数、赋值运算符、容量接口、迭代器接口、元素访问接口以及一些常用的增删操作函数。最后,还展示了如何使用`vector`创建字符串数组,体现了`vector`在实际编程中的灵活性和实用性。
39 4
|
15天前
|
C语言 C++ 容器
【c++丨STL】string模拟实现(附源码)
本文详细介绍了如何模拟实现C++ STL中的`string`类,包括其构造函数、拷贝构造、赋值重载、析构函数等基本功能,以及字符串的插入、删除、查找、比较等操作。文章还展示了如何实现输入输出流操作符,使自定义的`string`类能够方便地与`cin`和`cout`配合使用。通过这些实现,读者不仅能加深对`string`类的理解,还能提升对C++编程技巧的掌握。
37 5
|
15天前
|
存储 编译器 C语言
【c++丨STL】string类的使用
本文介绍了C++中`string`类的基本概念及其主要接口。`string`类在C++标准库中扮演着重要角色,它提供了比C语言中字符串处理函数更丰富、安全和便捷的功能。文章详细讲解了`string`类的构造函数、赋值运算符、容量管理接口、元素访问及遍历方法、字符串修改操作、字符串运算接口、常量成员和非成员函数等内容。通过实例演示了如何使用这些接口进行字符串的创建、修改、查找和比较等操作,帮助读者更好地理解和掌握`string`类的应用。
26 2
|
20天前
|
存储 算法 Linux
【c++】STL简介
本文介绍了C++标准模板库(STL)的基本概念、组成部分及学习方法,强调了STL在提高编程效率和代码复用性方面的重要性。文章详细解析了STL的六大组件:容器、算法、迭代器、仿函数、配接器和空间配置器,并提出了学习STL的三个层次,旨在帮助读者深入理解和掌握STL。
40 0
|
2月前
|
存储 程序员 C++
C++常用基础知识—STL库(2)
C++常用基础知识—STL库(2)
74 5
|
2月前
|
存储 自然语言处理 程序员
C++常用基础知识—STL库(1)
C++常用基础知识—STL库(1)
67 1
|
2月前
|
存储 算法 C++
高精度算法(加、减、乘、除,使用c++实现)
高精度算法(加、减、乘、除,使用c++实现)
572 0
高精度算法(加、减、乘、除,使用c++实现)
|
2月前
|
算法 数据处理 C++
c++ STL划分算法;partition()、partition_copy()、stable_partition()、partition_point()详解
这些算法是C++ STL中处理和组织数据的强大工具,能够高效地实现复杂的数据处理逻辑。理解它们的差异和应用场景,将有助于编写更加高效和清晰的C++代码。
29 0
|
21天前
|
存储 编译器 C++
【c++】类和对象(下)(取地址运算符重载、深究构造函数、类型转换、static修饰成员、友元、内部类、匿名对象)
本文介绍了C++中类和对象的高级特性,包括取地址运算符重载、构造函数的初始化列表、类型转换、static修饰成员、友元、内部类及匿名对象等内容。文章详细解释了每个概念的使用方法和注意事项,帮助读者深入了解C++面向对象编程的核心机制。
54 5
|
27天前
|
存储 编译器 C++
【c++】类和对象(中)(构造函数、析构函数、拷贝构造、赋值重载)
本文深入探讨了C++类的默认成员函数,包括构造函数、析构函数、拷贝构造函数和赋值重载。构造函数用于对象的初始化,析构函数用于对象销毁时的资源清理,拷贝构造函数用于对象的拷贝,赋值重载用于已存在对象的赋值。文章详细介绍了每个函数的特点、使用方法及注意事项,并提供了代码示例。这些默认成员函数确保了资源的正确管理和对象状态的维护。
56 4