C++ 使用分享

  • author: 樊萌萌
  • date: 2020-11-20 20:44:40

    一、常用集合

1.vector

也称为单端数组,不同之处在于数组是静态空间,而vector可以动态扩展
1
2
3
4
5
6
7
8
9
10
11
1.push_back(ele);	向尾部插入值
2.pop_back(); 删除最后一个元素
3.insert(,) 迭代器指向pos位置破损插入元素ele,例如
v1.insert(v1.begin(),100);头部(最前边)插入100,第一个参数是迭代器
4.insert(,,) 迭代器指向位置pos插入count个元素elev例如 v1.insert(v1.begin(),2,100);在开头插入2100
5.erase(..) 删除迭代器指向的元素
6.erase(strat,end) 删除迭代器从start到end之间的元素(左闭右开)
7.clear() 删除容器中的所有元素

//获取一些特殊位置的值
获取第一个元素:v1.front(); 最后一个:v1.back();
相当于二维数组用法,容器嵌套
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
28
29
30
31
32
33
34
35
36
37
38
39
#include <iostream>
using namespace std;
#include <vector>
//相当于二维数组

//vector容器嵌套容器
void test(){
vector<vector<int>> v;
//创建小容器
vector<int> v1;
vector<int> v2;
vector<int> v3;
vector<int> v4;
//向小容器中添加数据
for (int i = 0; i < 4; i++){
v1.push_back(i + 1);
v2.push_back(i + 2);
v3.push_back(i + 3);
v4.push_back(i + 4);
}
//将小容器插入到大容器中
v.push_back(v1);
v.push_back(v2);
v.push_back(v3);
v.push_back(v4);
//通过大容器,把所有数据遍历一遍
for (vector<vector<int>>::iterator it = v.begin(); it != v.end(); it++){
//(*it)用于解引,获取其中的内容,大容器进行该操作后,里边仍然是一个容器,需再次进行
for (vector<int>::iterator vit = (*it).begin(); vit != (*it).end(); vit++){
cout << *vit << " ";
}
cout << endl;
}
}

int main(){
test();
return 0;
}

2.string

创建
1
2
3
4
5
6
7
8
9
10
11
12
1.string();//创建一个空的字符串,例如:string str;
2.string(const char* s);//使用字符串s初始化
3.string(const string& str);//使用一个string对象初始化另一个string对象
4.string(int n,char c);//使用n个字符c初始化

void test(){
string s1;//默认构造 方式1
const char* str = "hello world";
string s2(str);//hello world 方式2
string s3(s2);//hello world 方式3
string s4(5,'a');//aaaaa 方式4
}
字符串替换(估值一亿的AI核心代码)
1
2
3
4
5
6
7
//字符串替换:在指定位置替换字符串 replace在替换时,需要指定从哪个位置起,多少个字符,替换成什么
string a,b;
string s ("AAAAAAAA");
string s1p ("BBB");
const char* cs1p = "CCC";
a = s.replace (1,3,s1p); // s= "ABBBAAAA"
b = s.replace (5,3,cs1p);
字符串截取
1
2
3
//!!!!!!!!!!!!!!!!string子串,截取字符串
string str = "abcdef";
string sub = str.substr(1,3);//从位置1开始截取三个

3.queue

普通队列,先进先出的数据结构,有两个出口(入队、出队)
1
2
3
4
5
6
push();
pop();
empty();
front();
back();
size();

4.stack

1
2
3
4
top();
pop();
empty();
size();

5.map

pair对组

成对出现的数据,利用对组可以返回两个数据
1
2
3
4
5
6
7
void test(){
//创建方式一:
pair<string,int> p("Tom",20);
cout << "姓名是:" << p.first << " 年龄是:" << p.second << endl;
//创建方式二:
pair<string,int> p2 = make_pair("Lily",15);
}

键值对map

1.map中所有元素都是pair
2.pair中第一个元素是key(键值),起到索引作用,第二个元素是value(实值)
3.所有元素会根据元素的键值自动排序
1
2
3
insert();
size();
erase();//可按键删除或按迭代器

6.set

所有元素都会在插入时自动被排序,不允许容器中有重复元素
1
2
3
4
5
6
7
insert();
size();
empty();
clear();
erase();//同vector
find();//find(key)查找key是否存在,若存在,返回该键的元素的迭代器,即位置,若不存在,返回set.end()即最后一个元素的位置
set<int>::iterator pos = s1.find(30);

7.deque

==双端数组,可对头端进行插入删除操作==
插入删除操作基本同vector,但由于deque是双端的,所以有push_front(elem)在容器头部插入一个数据 pop_front();删除容器第一个数据
数据存取,获取元素方式同vector
deque排序(利用算法实现)
sort(开始位置,结束位置)默认排序规则是升序

8.list

将数据进行链式存储
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
1.empty()是否为空
2.size()大小
3.resize()重新指定大小

//list容器插入和删除
front();返回第一个元素
back();返回最后一个元素
push_front()在开头插入一个元素
pop_front_()热电厂()从容器中移除第一个元素
pop_back()从容器中移除最后一个元素
insert(pos,elem)在pos位置插elem元素的拷贝,返回新数据的位置
insert(pos,n,eleem)在pos位置插入n个elem数据,无返回值
insert(pos,beg,end)在pos位置插入beg,end区间的数据,无返回值
clear()
erase(beg,end)删除beg,end区间的数据,返回下一个数据的位置
erase(pos)删除该位置的数据,返回下一个数据的位置
remove(elem)删除容器中所有与elem值匹配的元素

排序 直接调用sort()方法报错!!所有不支持随机访问迭代器的容器,不可以用标准算法,所以不能使用该排序算法。使用成员函数:l1.sort();

二、常用函数

1.反转

1
2
3
4
5
6
//reverse函数用于反转在[first,last)范围内的顺序(包括first指向的元素,不包括last指向的元素),reverse函数无返回值

string str="hello world , hi";
reverse(str.begin(),str.end());//str结果为 ih , dlrow olleh
vector<int> v = {5,4,3,2,1};
reverse(v.begin(),v.end());//容器v的值变为1,2,3,4,5

2.重置

1
2
3
//头文件是cstring或者memory.h
memset(arr,0,sizeof(arr));
memset(vis,false,sizeof(vis));

3.排序

1
2
sort(vec.begin(),vec.end(),greater<int>());//内置类型从大到小
sort(vec.begin(),vec.end(),less<int>()); //内置类型从小到大

4.查找

1
2
3
4
5
6
7
8
9
10
11
12
13
查找指定元素,找到返回指定元素的迭代器
//查找内置数据类型
void test01(){
vector<int> v;
for(int i = 0; i< 5; i++){
v.push_back(i);
}
vector<int>::iterator it = find(v.begin(),v.end(),5);
if(it==v.end())
//没找到
else
cout << "找到了:" << *it << endl;
}

三、字符串与数字的相互转换

1.字符串转数字

1
//常用的是stoi

2.数字转字符串

1
2
//a = 1234
string s = to_string(a);

四、不常用但又用的函数和容器

列车调度

1
lower_bound与upper_bound

堆——神奇的优先队列

1
2
3
4
5
6
7
8
9
priority_queue:优先队列,相当于堆
小顶堆,大顶堆

//对于基础类型 默认是大顶堆
priority_queue<int> a;
//等同于 priority_queue<int, vector<int>, less<int> > a;

//这里一定要有空格,不然成了右移运算符↓↓
priority_queue<int, vector<int>, greater<int> > c; //这样就是小顶堆