C/C++随手记

(c风格)输出格式化

  • %d:读入一个 32位有符号整数。
  • %u:读入一个 32 位无符号整数。
  • %lld:读入一个 64 位有符号整数。
  • %llu:读入一个 64 位无符号整数。
  • %f:读入一个 float 类型。
  • %lf:读入一个 double 类型。

(c风格)字符串处理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <cctype>

isalpha():检查这个字符是否为字母,真返回1,假返回0

isalnum():检查这个字符是否为字母或数字数字,同上;

isdigit():检查这个字符是否为十进制数字,同上;

islower():检查这个字符是否为小写字母,同上;

//查找单个字符
//strchr与strrchr函数的不同在于:strchr从左向右查找字符,strrchr从右向左查找字符。
char *strchr(const char *s, int c);
char *strrchr(const char *s, intc);

//查找子串
char *strstr(const char *str1, const char *str2);

//查找多个字符中任一字符 strpbrk
char *strpbrk(const char *s1, const char *s2);

//strspn从字符串s的第一个字符开始,逐个检查与字符串accept中的字符是否不相同,如果不相同,停止检查,返回以字符串s开头连续包含accept内的字符的数目;
//strcspn从字符串s的第一个字符开始,逐个检查与reject中的字符是否相同,如果相等,停止检查,返回以字符串s开头连续不含字符串reject内的字符数目,
size_t strspn(const char *s,const char *accept);
size_t strcspn(const char *s,cosnt char *reject);

(c风格)字符长度

1
2
#include <string.h>
size_t strlen( char *str );

(c风格)字符串格式化

1
2
#include <stdio.h>
int sscanf( const char *buffer, const char *format, ... );

(c风格)获取单行字符串

1
2
char cs[50] ;
gets(cs);

(c风格)malloc(分配未初始化的内存

静态对象的分配与释放由编译器自动处理;动态对象的分配与释放必须由程序员显式地管理,它通过malloc()和free两个函数(C++中为new和delete运算符)来完成。

1
2
3
4
5

char *p1; //p1在BSS区(未初始化全局变量)
p1 = (char *)malloc(10);//分配得来的10个字节的区域在堆区
p1 = (char *)malloc(10*sizeof(int));//分配得来得10*4字节的区域在堆区
free(p1);//释放p1内存的空间

(c风格)calloc(分配初始化了的内存

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <stdio.h>
#include <stdlib.h>

int main()
{
int i, n;
int *a;

printf("要输入的元素个数:");
scanf("%d",&n);

a = (int*)calloc(n, sizeof(int));
printf("输入 %d 个数字:\n",n);
for( i=0 ; i < n ; i++ )
{
scanf("%d",&a[i]);
}

printf("输入的数字为:");
for( i=0 ; i < n ; i++ ) {
printf("%d ",a[i]);
}
free (a); // 释放内存
return(0);
}

(c风格)定义结构体

1
2
3
4
5
6
typedef struct Node *PtrToNode;
struct Node {
ElementType Data; /* 存储结点数据 */
PtrToNode Next; /* 指向下一个结点的指针 */
};
typedef PtrToNode List; /* 定义单链表类型 */

(c++风格)输入输出

关闭输入输出提高性能

1
2
3
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);

输出保留6位小数

1
cout<<fixed<<setprecision(6)<<l;

(C++风格读取单行字符串)

1
2
#include<string>
getline(cin,b1);

(c++风格)半自动初始化内存

1
2
3
string *s = new string("Liu Zhang Hao");//开辟内存

delete s ;//释放内存

(c++风格)结构体

c++的结构体可以实现类的所有功能,除了访问权限。可以包含成员函数,可以继承,可以实现多态!!但是我个人不建议使用

(c++风格)访问控制和继承

访问 public protected private
同一个类 yes yes yes
派生类 yes yes no
外部的类 yes no no

一个派生类继承了所有的基类方法,但下列情况除外:

  • 基类的构造函数、析构函数和拷贝构造函数。
  • 基类的重载运算符。
  • 基类的友元函数。

(C++STL库)algorithm库

lower_bound

1
lower_bound(is,is+8,6);//返回指向大于等于key的第一个值

reverse翻转数据

1
reverse(cstr.begin(),cstr.end());

swap交换数据

1
swap(a,b);

unique去除数组中相邻重复项

返回取重结束后的尾迭代器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
string str;
cout << (str = "hello word") << endl;
//输出没有取重的字符串
cout << "str_len = " << str.size() << endl;
string::iterator it = str.begin();
string::iterator end = unique(str.begin(), str.end());
//输出取重未删除重复元素的字符串
cout << str << endl;
//输出取重后的字符串
for(;it<end;it++)cout << *it ;
return 0;
}

(C++STL库)vector

(1)vector容器和数组非常相似,也称为单端数组。
(2)vector与普通数组区别:不同之处在于数组是静态空间,而vector可以动态扩展。 动态扩展并不是在原空间之后续接新空间,而是找更大的内存空间,然后将原数据拷贝新空间,释放原空间。
(3)vector容器的迭代器是支持随机访问的迭代器。
原文链接:https://blog.csdn.net/WL0616/article/details/123165852

vector常用的操作函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
1. vector<T> v; //T表示数据的类型,可以是int类型,也可以是string对象。
2. vector(v.begin(), v,end()); //将v[begin().end())区间(前闭后开)中的元素拷贝给本身。
3. vector(n, elem); //构造函数将n个elem拷贝给本身。
4. vector(const vector &vec); //拷贝构造函数。
5. vector& operator=(const vector &vec); //重载等号操作符。
6. assign(begin,end); //将[begin,end)区间中的数据拷贝赋值给本身。
7. assign(n,elem); //将n个elem拷贝赋值给本身。
8. empy(); //判断容器是否为空。
9. capacity(); //容器的容量。
10. size(); //返回容器中元素的个数。
11. resize(int num); //重新指定容器的长度为num,若容器变长,则以默认值填充新位置。
//如果容器变短,则末尾超出容器长度的元素被删除。
12. resize(int num, elem); //重新指定容器的长度为num,若容器变成,则以elem值填充新位置。
//如果容器变短,则末尾超出容器长度的元素被删除。
13. push_back(ele); //尾部插入元素ele。
14. pop_back(); //删除最后一个元素。
15. insert(const_iterator pos, ele); //迭代器指向位置pos插入元素ele。
16. insert(const_iterator pos, int count ele); //迭代器指向位置pos插入count个元素。
17. erase(const_iterator pos); //删除迭代器指向的元素。
18. erase(cons_titerator start, const_iterator end); //删除迭代器从start到end之间的元素。
19. clear(); //删除容器中所有元素。
20. at(int idx); ///返回索引为idx所指的数据。
21. operator[]; //返回索引idx所指的数据。
22. front(); //返回容器中第一个数据元素。
23. back(); //返回容器中最后一个数据元素。
24. swap(vec); //将vec与本身的元素互换。
25. reserve(int len); //容器预留len个元素长度,预留位置不初始化,元素不可访问。

构造函数

1
2
3
4
1. vector<T> v; //T表示数据的类型,可以是int类型,也可以是string对象
2. vector(v.begin(), v,end()); //将v[begin().end())区间(前闭后开)中的元素拷贝给本身。
3. vector(n, elem); //构造函数将n个elem拷贝给本身
4. vector(const vector &vec); //拷贝构造函数

遍历

删除

STL二分查找

头文件

1
#include<algorithm>//用到lower_bound
1
2
//二分查找,右
lower_bound(first,last,value)

指向首个不小于 value 的元素的迭代器,或若找不到这种元素则为 last

1
2
//二分查找,右+
upper_bound(first,last,value);

指向首个大于 value 的元素的迭代器,或若找不到这种元素则为 last