使用这些函数前要加上include
和using namespace std;
。
max(x,y)、min(x,y)
分别返回x和y中的最大、小值。如果要返回x、y、z中的最大值,可用``max(x,max(y,z))`
abs(x)
返回x的绝对值,x必须是整数。 浮点数的绝对值用math头函数下的fabs(x)
。
swap(x,y)
交换x和y的值。
reverse(it,it2)
可将数组指针在[it, it2)之间的元素或容器的迭代器在[it, it2)之间的元素进行反转。
#include
#include
using namespace std;
int main(void){
int a[10] = {
10, 11, 12, 14, 15, 16};
reverse(a, a + 3);
for(int i = 0; i < 6; i++) {
printf("%d ", a[i]);
}
return 0;
}
输出结果:
12 11 10 14 15 16
容器(如string):
#include
#include
#include
using namespace std;
int main(void){
string str = "abcdefg";
reverse(str.begin() + 3, str.begin() + 7);
for(int i = 0; i < 7; i++) {
printf("%c ", str[i]);
}
return 0;
}
输出结果:
a b c g f e d
permutation为排列的意思。
next_permutation()
给出一个序列在全排列中的下一个序列。返回bool类型。
例如,当n==3时的全排列为:
123
132
213
231 //231的下一个序列就是312
312
321
#include
#include
using namespace std;
int main(void){
int a[10] = {
1, 2, 3};
do{
printf("%d%d%d\n", a[0], a[1], a[2]);
}while(next_permutation(a, a + 3));
return 0;
}
输出结果:
123
132
213
231
312
321
fill()
可以把数组或容器某一段区间赋为某个相同的值。和memset
不同,这里的赋值可以是数组类型对应范围中的任意值。
#include
#include
using namespace std;
int main(void){
int a[10] = {
1, 2, 3, 4, 5};
fill(a, a + 5, 33);
for(int i = 0; i < 5; i++) {
printf("%d ", a[i]);
}
return 0;
}
输出结果:
33 33 33 33 33
定义:
sort(首元素地址(必填),尾元素地址的下一个地址(必填),比较函数(非必填));
如果不写比较函数,默认对给出区间进行递增排序。
#include
#include
using namespace std;
int main(void){
int a[6] = {
4, 2, 44, 1, 23, -2};
sort(a, a + 4); // 将a[0]~a[3]从小到大排序
for(int i = 0; i < 6; i++) {
printf("%d ", a[i]);
}
printf("\n");
sort(a, a + 6); // 将a[0]~a[5]从小到大排序
for(int i = 0; i < 6; i++) {
printf("%d ", a[i]);
}
return 0;
}
输出结果:
1 2 4 44 23 -2
-2 1 2 4 23 44
#include
#include
using namespace std;
int main(void){
double a[] = {
1.3, -2.1, 4};
sort(a, a + 3);
for(int i = 0; i < 3; i++) {
printf("%.1f ", a[i]);
}
return 0;
}
输出结果:
-2.1 1.3 4.0
#include
#include
using namespace std;
int main(void){
char a[] = {
'T', 'a', 'W', 'A'};
sort(a, a + 4);
for(int i = 0; i < 4; i++) {
printf("%c ", a[i]);
}
return 0;
}
A T W a
结构体本身没有大小关系,需要人为定制比较的规则,用compare函数(一般写作cmp函数),实现这个规则。
基本数据类型数组的排序:
如果想要从大到小排序,要使用cmp“告诉”sort何时要交换元素。
#include
#include
using namespace std;
bool cmp(int a, int b) {
return a > b; // 可以理解为当a > b时把a放b前面
}
int main(void){
int a[6] = {
4, 2, 44, 1, 23, -2};
sort(a, a + 6, cmp); // 将a[0]~a[5]从大到小排序
for(int i = 0; i < 6; i++) {
printf("%d ", a[i]);
}
return 0;
}
输出结果:
44 23 4 2 1 -2
double型、char类型数据同理。
结构体数组的排序
#include
#include
using namespace std;
struct node{
int x, y;
}ssd[10];
bool cmp(node a, node b) {
// 先将x按从大到小排序,当x相等的情况下,按照y的大小按 从大到小排序
if(a.x != b.x) return a.x > b.x;
else return a.y > b.y;
}
int main(void){
ssd[0].x = 2;
ssd[0].y = 2;
ssd[1].x = 1;
ssd[1].y = 3;
ssd[2].x = 2;
ssd[2].y = 1;
sort(ssd, ssd + 3, cmp);
for(int i = 0; i < 3; i++) {
printf("%d %d\n", ssd[i].x, ssd[i].y);
}
return 0;
}
输出结果:
2 2
2 1
1 3
容器的排序
STL容器中,只有vector、string、deque是可以使用sort的。这是因为想set、map这种容器是用红黑树实现的(了解即可),元素本身有序。
vector
#include
#include
#include
using namespace std;
bool cmp(int a, int b) {
return a > b; //按从大到小排序
}
int main(void){
vector<int> vi;
vi.push_back(3);
vi.push_back(1);
vi.push_back(2);
sort(vi.begin(), vi.end(), cmp); // 对整个vector排序
for(int i = 0; i < 3; i++) {
printf("%d ", vi[i]);
}
return 0;
}
输出结果:
3 2 1
string
#include
#include
#include
using namespace std;
bool cmp(string a, string b) {
return a.length() < b.length(); // 按string的长度从小到大排序
}
int main(void){
string str[] = {
"bbbbbbb", "aaa", "ccccc"};
sort(str, str + 3, cmp);
for(int i = 0; i < 3; i++) {
cout << str[i] << endl;
}
return 0;
}
输出结果:
aaa
ccccc
bbbbbbb
lower_bound()
、upper_bound()
需要用在一个有序数组或容器中。
lower_bound(first, last, val)
:寻找在在数组或容器的[first, last)范围内的第一个值大于等于val
元素的位置,如果是数组,则返回该位置的指针;如果是容器,则返回该位置的迭代器。
upper_bound(first, last, val)
:寻找在在数组或容器的[first, last)范围内的第一个值大于val
元素的位置,如果是数组,则返回该位置的指针;如果是容器,则返回该位置的迭代器。
如果数组或容器中没有需要寻找的元素,则lower_bound()
、upper_bound()
均返回可以插入该元素的位置的指针和迭代器。
#include
#include
using namespace std;
void findPos(int a[], int n, int value){
int* lowerPos = lower_bound(a, a + n, value);
int* upperPos = upper_bound(a, a + n, value);
printf("%d, %d\n", lowerPos - a, upperPos - a);
}
int main(void){
int a[10] = {
1, 2, 2, 3, 3, 3, 5, 5, 5, 5};
// 寻找-1
findPos(a, 10, -1);
// 寻找1
findPos(a, 10, 1);
// 寻找3
findPos(a, 10, 3);
// 寻找4
findPos(a, 10, 4);
// 寻找6
findPos(a, 10, 6);
return 0;
}
输出结果:
0, 0
0, 1
3, 6
6, 6
10, 10