C++常用函数
cstring类型
比较和计算
strcmp(a,b);
比较返回两个char数组的差异度(-2表示有一个char不同)
strlen(a);
计算string或char数组的长度
size();
lenth();
函数 | 功能 是为1 否为0 |
---|---|
isalpha | 判断是否为字母 |
islower/isupper | 小/大写字母 |
isdigit | 数字 |
isalnum | 字母或数字 |
tolower/toupper | 转换为小/大写字母 |
初始化
memset(s, c, n);
将以开辟内存s的前n个直接初始化为c
n可以用sizeof(s)
复制
memcpy(b, a, n);
以a开头,长度为n的内存,拷贝到b中
strncpy(b,a,n);
以a开头,长度为n的内存,拷贝到b中,并返回b
strcpy(b,a);
从a开始复制给b,遇到NULL ‘/0’结束
strcat(b,a);
把a连接到b后
输入
getline(cin,a,n);
将流中的字符存在a中,
遇到n结束,没有默认为‘/n’
cctype
tolower(); toupper();
改变字母大小写
isalpha(); isdigit(); isprint();
判断是否是字母,数字,可打印字符(非控制字符)
algorithm
min(); max()
返回两个元素中最小(最大)的一个
upper_bound(first, last, n);
查找区间中第一个大于n的位置,返回的是地址
lower_bound(first, last, n);
查找区间中第一个大于等于n的位置,返回的是地址
next_permutation(first, last); prev_permutation();
将数组中的元素全排列
需要将数组进行升序排列,否则只能找出该序列之后的全排列数。
char a[4]={'a','b','c','d'};
do{
for(int i=0;i<4;++i)
cout<<a[i]<<" ";
cout<<endl;
}while(next_permutation(a,a+4));
sort(first, last, greater<>());
int a[5]={5,2,4,3,1},b[3]="cba";
sort(a,a+5);//正序排列
sort(a,a+5,greater<>());//逆序排列数字
sort(b,b+3,greater<char>());//逆序排列char
fill(first, last, a);
可将数组的值初始化成a
vector
一个动态申请空间的数组
定义 vector < typename > name;
typename可以是任何基本类型 结构体,STL容器vector,set,queue等。
vector<int> stu;
vector<double> stu;
vector<char> stu;
vector<node> stu;//node是结构体类型
vector<vector<int>> name;
vector<typename> a[arraySize];//申请一个二维数组
初始化
//初始化了10个默认值为0的元素
vector<int> abc(10);
//初始化了10个值为1的元素
vector<int> cde(10,1);
int a[5] = {1,2,3,4,5};
//通过数组a的地址初始化,注意地址是从0到5(左闭右开区间)
vector<int> b(a, a+5);
vector<int> a(5,1);
//通过a初始化
vector<int> b(a);
//insert初始化方式将同类型的迭代器对应的始末区间(左闭右开区间)内的值插入到vector中
vector<int> a(6,6);
vecot<int> b;
//将a[0]~a[2]插入到b中,b.size()由0变为3
b.insert(b.begin(), a.begin(), a.begin() + 3);
//在b开始位置处插入6个6
b.insert(b.begin(), 6, 6);
vector<int> a(5,1);
int a1[5] = {2,2,2,2,2};
vector<int> b(10);
/*将a中元素全部拷贝到b开始的位置中,注意拷贝的区间为a.begin() ~ a.end()的左闭右开的区间*/
copy(a.begin(), a.end(), b.begin());
//拷贝区间也可以是数组地址构成的区间
copy(a1, a1+5, b.begin() + 5);
访问
下标访问
从0开始
迭代器
vector
常用函数
push_back(a)
在vector最后面添加一个元素a
pop_back(x)
删除vector的尾元素x
size()
clear()
清空vector所有的元素
insert();
insert(it,x);向vector的任意迭代器it初传入一个元素x
a.insert(a.begin()+1, 5);在a的第1个元素(从第0个算起)的位置插入数值5,如a为1,2,3,4,插入元素后为1,5,2,3,4
a.insert(a.begin()+1, 3,5);在a的第1个元素(从第0个算起)的位置插入3个数,其值都为5
a.insert(a.begin()+1,b+3, b+6);b为数组,在a的第1个元素(从第0个算起)的位置插入b的第3个元素到第5个元素(不包括b+6),如b为1,2,3,4,5,9,8,插入元素后为1,4,5,9,2,3,4,5,9,8
erase()
erase(x); 删除单个元素
erase(a,b); 删除左闭右开区间内[a,b)的元素
copy(a.begin(),a.end(),b.begin()+1);
把a中的从a.begin()(包括它)到a.end()(不包括它)的元素复制到b中,从b.begin()+1的位置(包括它)开始复制,覆盖掉原有元素
find(a.begin(),a.end(),10);
在a中的从a.begin()(包括它)到a.end()(不包括它)的元素中查找10,若存在返回其在向量中的位置
set
一个内部自动升序而且不重复元素的容器
定义
操作 | 效果 |
---|---|
set c | 产生一个空的set/multiset,不含任何元素 |
set c(op) | 以op为排序准则,产生一个空的set/multiset |
访问
只能通过迭代器
set
常用函数
insert(x)
将x插入set容器中,并且自动递增排序和去重
size()
clear()
end()
返回最后一个的迭代器
find(x)
查找值为x的元素,返回它的迭代器
erase()
erase(x); 删除单个元素
erase(a,b); 删除左闭右开区间内[a,b)的元素
multiset
有序可重复的容器
通过重载确定排序规则
struct rec{
int x,y;
};
struct cmp{
bool operator()(const rec&a,const rec&b){
return a.x<b.x||a.x==b.x&&a.y<b.y;
}
};
multiset<rec,cmp>h;
map
建立key(第一个值)和value(第二个值) 的对应,以key为标准有序
定义
map<int , int> maps;
访问
maps[key] = value; //给key赋值,key有对应的value就覆盖
It->first = 1;
常用函数
insert()
maps.insert(pair<type,type>(1,1)); //maps[1] = 1;
find()
map<type,type>::iterator it = maps.find(x); //auto代替map<type,type>::iterator 自动推断值的类型
长度
maps.empty(); //空返回1
maps.size();
maps.count(x); //返回指定元素出现的次数
逆向迭代器
maps.rbegin(); //返回指向maps尾部的逆向迭代器
maps.rend(); //返回指向maps头部的逆向迭代器
bound
maps.lower_bound(); //返回键值>=给定元素的第一个迭代器
maps.upper_bound(); //返回键值>给定元素的第一个迭代器
遍历
for(map<type,type>::iterator it = maps.begin(); it != maps.end(); it++)
erase()
maps.erase(iterator)
maps.erase(type)
哈希hashtable
unordered_set 不存储重复元素
unordered_map 实现key和value的映射
对比set和unordered_set
map和unordered_set也相同
对比 | set | unordered_set |
---|---|---|
有序 | 有序 | 无序 |
实现 | BST或RBT | Hash Table |
插入、删除 | log n | 平均O(1),最坏O(n) |
unordered_map的成员
成员方法 | 功能 |
---|---|
begin() | 返回指向容器中第一个键值对的正向迭代器。 |
end() | 返回指向容器中最后一个键值对之后位置的正向迭代器。 |
cbegin() | 和 begin() 功能相同,只不过在其基础上增加了 const 属性,即该方法返回的迭代器不能用于修改容器内存储的键值对。 |
cend() | 和 end() 功能相同,只不过在其基础上,增加了 const 属性,即该方法返回的迭代器不能用于修改容器内存储的键值对。 |
empty() | 若容器为空,则返回 true;否则 false。 |
size() | 返回当前容器中存有键值对的个数。 |
max_size() | 返回容器所能容纳键值对的最大个数,不同的操作系统,其返回值亦不相同。 |
operator[key] | 该模板类中重载了 [] 运算符,其功能是可以向访问数组中元素那样,只要给定某个键值对的键 key,就可以获取该键对应的值。注意,如果当前容器中没有以 key 为键的键值对,则其会使用该键向当前容器中插入一个新键值对。 |
at(key) | 返回容器中存储的键 key 对应的值,如果 key 不存在,则会抛出 out_of_range 异常。 |
find(key) | 查找以 key 为键的键值对,如果找到,则返回一个指向该键值对的正向迭代器;反之,则返回一个指向容器中最后一个键值对之后位置的迭代器(如果 end() 方法返回的迭代器)。 |
count(key) | 在容器中查找以 key 键的键值对的个数。 |
equal_range(key) | 返回一个 pair 对象,其包含 2 个迭代器,用于表明当前容器中键为 key 的键值对所在的范围。 |
emplace() | 向容器中添加新键值对,效率比 insert() 方法高。 |
emplace_hint() | 向容器中添加新键值对,效率比 insert() 方法高。 |
insert() | 向容器中添加新键值对。 |
erase() | 删除指定键值对。 |
clear() | 清空容器,即删除容器中存储的所有键值对。 |
swap() | 交换 2 个 unordered_map 容器存储的键值对,前提是必须保证这 2 个容器的类型完全相等。 |
bucket_count() | 返回当前容器底层存储键值对时,使用桶(一个线性链表代表一个桶)的数量。 |
max_bucket_count() | 返回当前系统中,unordered_map 容器底层最多可以使用多少桶。 |
bucket_size(n) | 返回第 n 个桶中存储键值对的数量。 |
bucket(key) | 返回以 key 为键的键值对所在桶的编号。 |
load_factor() | 返回 unordered_map 容器中当前的负载因子。负载因子,指的是的当前容器中存储键值对的数量(size())和使用桶数(bucket_count())的比值,即 load_factor() = size() / bucket_count()。 |
max_load_factor() | 返回或者设置当前 unordered_map 容器的负载因子。 |
rehash(n) | 将当前容器底层使用桶的数量设置为 n。 |
reserve() | 将存储桶的数量(也就是 bucket_count() 方法的返回值)设置为至少容纳count个元(不超过最大负载因子)所需的数量,并重新整理容器。 |
hash_function() | 返回当前容器使用的哈希函数对象。 |