cpp基础知识复习

复习一下c++的基础知识

字符串string

构造函数

1
2
3
4
string str;
string str(str1);
string str("hello");
string str(len,'a'); //储存len个'a'

常用函数

1
2
3
4
5
6
7
8
9
10
11
12
str.assign("abc"); //重新赋值为"abc"
str.assign("abc",2); //重新赋值为"ab"
str.assign("a",5); //重新赋值为"aaaaa"
str.length();
str.resize(len,'a'); //设置长度为len,若不足用'a'填充
str.swap(str1); //交换str与str1
str.append("ABC");
str.find('a');
string newstr = str.substr(start,length);
std::stoi(str) //string转int,c++11
std::to_string(value) //数字转string,c++11
str.c_str() //返回char*类型的临时指针,最好用strcpy复制到对应char*

accumulate函数

需要#include <numeric>

1
2
int sum = accumulate(vec.begin() , vec.end() , origin);
// 将vec中所有元素求和并加上origin

reverse函数

需要#include<algorithm>

1
2
reverse(str.begin(),str.end());
reverse(vec.begin(),vec.end());

sort函数

需要#include<algorithm>

1
sort(first_pointer, first_pointer+n, cmp)

sort()默认为升序排列,如果要改变顺序或者适应结构体需要cmp函数

1
2
3
4
5
6
7
// cmp函数:
bool compare(int a,int b){
return a<b; //升序
//return a>b //降序
}

sort(vec.begin(), vec.end(), compare)

set

需要#include<set>

1
2
3
4
5
6
7
8
9
s.begin();
s.end()
s.clear();
s.empty();
s.insert();
s.erase();
s.size();
s.count(value); //返回set中该值的次数,只可能返回0或1
s.find(value); //返回value的指针,如果没有则返回s.end()

以下部分参考知乎专栏

vector

需要#include<vector>

1
2
3
4
5
6
7
8
9
vector<int>vec;
vec.clear();
vec.push_back(1);
vec.pop_back();//删除最后的元素
vec.pop_front();//删除最前的元素
vec.end()//返回末尾指针,不是最后一个元素而是越界的迭代器
vec[0];//取值
vec.insert(pos,value)//pos用迭代器
vec.size();//数组长度

map

需要#include<map>

1
2
3
4
5
6
7
map<char,int>char2int;
char2int.clear();
char2int['a'] = 2;
char2int.count['a'];//查询 是否存在 'a' 存在返回1 不存在返回0
char2int.erase('a');//删除指定键
char2int.size();//字典大小
char2int.find('a')//存在返回位置,可以用->second得到值,不存在返回char2int.end()

queue

需要#include<queue>

1
2
3
4
5
6
7
queue<int>que;
que.empty();
while(!que.empty())que.pop();//que清空,没有clear函数
que.push(1);
que.pop();//出队1个元素,没有返回值
que.front();//查询队首元素值
que.size();

stack

需要#include<stack>

1
2
3
4
5
6
stack<int>st;
st.empty();
st.push();
st.pop();//出栈一个元素,没有返回值
st.top();//栈顶
st.size();

lower_bound与upper_bound

需要#include<algorithm>,同时数组要求有序。

1
2
lower_bound(begin,end,value)//返回第一个大于等于value的位置(迭代器),不存在则返回end
upper_bound(begin,end,value)//返回第一个大于value的位置(迭代器),不存在则返回end

二者的区间都是左闭右开(配合stl类型中的begin()与end())。需要得到下标位置可以减去头指针。

stl容器遍历的迭代写法

1
2
3
4
5
6
7
8
//正向遍历
for(vector<int>::iterator iter=vec.begin();iter!=vec.end();iter++){
cout<<*iter<<endl;
}
//反向遍历
for(vector<int>::reverse_iterator iter=vec.rbegin();iter!=vec.rend();iter++){
cout<<*iter<<endl;
}

链表与数组

数组初始分配连续空间,可以下标访问(随机访问),但是修改麻烦。适合访问多修改少的情况。

链表使用指针链接,不能下标访问,插入删除方便。适合修改多访问少的情况。

Author: Jiaming Luo
Link: http://wanpiqiu123.github.io/2020/06/18/cpp%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86%E5%A4%8D%E4%B9%A0/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.