刷算法题常用C++知识

输入(cin)

1
char a,b; cin>>a>>b; cout<<a<<b<<endl; //给a,b赋值,输出a,b的值,换行

注意:

  • cin读入数据的效率略低于scanf。
  • cin读取数据,以空格、tab或换行作为分隔符。
  • 例如(输入):m n
  • a与b的值就分别是m和n,m与n之间的空格被直接忽略了。
  • 如果使用scanf("%c%c",&a,&b);a与b的值就分别是m和空格,中间的空格被成功读取。scanf("%c %c",&a,&b);格式化输入后,a与b的值即为m和n。

总结:在对输入效率没有过高要求且数据是以空格、tab或换行作为分隔符德情况下,可以使用cin方便操作。

字符串(string)

输入字符串

1
2
3
4
5
6
char str1[10];
scanf("%s",str1);//遇到空格/换行符为结束
cin.getline(str1,10);//读入一行
string str2;
cin>>str2;//遇到空格/换行符为结束
getline(cin,str2);//读入一行。注意使用的是string流的getline方法,因此需要导入string库

声明赋值

1
2
3
string s1,s2;//声明空字符串s1,s2
s1="hello";//给s1赋值
s2=s1;//把s1的值赋给s2,s2的值为"hello"

字符串连接

1
string s3=s1+s2;//将s1,s2连接的值赋给s3,s3的值为"hellohello"

字符串截取

两种形式,substr(pos,n)和substr(pos)。

1
2
string s4=s3.substr(0,3);//s4的值为s3下标0开始往后3个字符,即"hel"
string s5=s3.substr(4);//s4的值为s3下标4开始后面所有字符,即"ohello"

比较操作符

string重载了很多操作符,对字符串比较十分方便。
==,!=,<,>,<=,>=都可以用来做操作符两端字符串的比较,具体比较规则参照字符串的字典序大小。

获取长度

可以用s.length()或者s.size(),没有区别。

1
2
s1.length();//5
s1.size();//5

引用(&)

这里主要说一下引用和指针的区别。

  • 指针存储的是一块内存的地址,通过地址,可以访问这块内存;
    引用则是一个变量的别名,在创建时必须初始化。
  • 引用在初始化后不能改变,指针可以修改指向的对象
1
2
int *p=&a;//初始化指针p,指向a的地址
int &r=a;//给a取一个别名r,可以说r就是a

函数传参:以函数swap(a,b)为例。

  1. 指针写法

    1
    2
    3
    4
    5
    6
    7
    void swap(int *a,int *b)
    {
    int tmp;
    tmp = *a;
    *a = *b;
    *b = tmp;
    }
  2. 引用写法

    1
    2
    3
    4
    5
    6
    7
    void swap(int &a,int &b)
    {
    int tmp;
    tmp = a;
    a = b;
    b = tmp;
    }

常用STL容器

  C++ STL(标准模板库)是一套功能强大的 C++ 模板类,提供了通用的模板类和函数,这些模板类和函数可以实现多种流行和常用的算法和数据结构,如向量、链表、队列、栈。

vector(动态数组)

头文件#include

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
//声明一个int型的动态数组
vector<int> vec;

//vec的大小
vec.size();

//判断是否为空
vec.empty();

//vec的最大容量
vec.max_size();

//修改vec的大小
vec.resize();

//末尾添加元素
vec.push_back();

//末尾删除元素
vec.pop_back();

//下标访问
vec[0];

//迭代器遍历
vector<int>::iterator it;
for (it = vec.begin(); it != vec.end(); it++)
cout << *it << endl;

//下标遍历
for (unsigned i = 0; i < vec.size(); i++) {
cout << vec[i]<< endl;
}

set(集合)

头文件#include
在set中每个元素的值都唯一,而且系统能根据元素的值自动进行排序。
比如先后向集合中插入4 3 3 2 2 1,最后集合中的结果为1 2 3 4。

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
//声明一个int型的集合
set<int> s;

//set的大小
s.size();

//判断是否为空
s.empty();

//set的最大容量
s.max_size();

//向集合中添加元素
insert(value);

//在集合中删除元素
erase(value);

//返回集合第一个元素的地址
s.begin();

//返回集合最后一个元素的地址
s.end();

//迭代器遍历
set<int>::iterator it;
for (it = s.begin(); it != s.end(); it++)
cout << *it << endl;

//判断指定值是否存在于集合中
if(s.find(value) == s.end())
cout<<value<<"不在集合中"<<endl;

map(映射)

头文件#include
自动建立Key(关键字)- value(值)的对应。key 和 value可以是任意你需要的类型。

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
//声明一个关键字为string型,值为int型的集合
map<string,int> m;

//map的大小
m.size();

//判断是否为空
m.empty();

//向集合中添加元素
m["test"]=2;

//在集合中删除元素
m.erase("test");

//返回集合第一个元素的地址
m.begin();

//返回集合最后一个元素的地址
m.end();

//迭代器遍历
map<string,int>::iterator it;
for (it = m.begin(); it != m.end(); it++)
cout << it->first()<<it->second() << endl;

//判断指定关键字的数据是否存在于映射中
if(m.find(key) == m.end())
cout<<key<<"不在映射中"<<endl;

stack(栈)

头文件#include

1
2
3
4
5
stack<int> s;//声明一个空栈
s.size();//栈大小
s.push();//压栈
s.top();//访问栈顶元素
s.pop();//移除栈顶元素

queue(队列)

头文件#include

1
2
3
4
5
6
queue<int> q;//声明一个空队列
q.size();//队大小
q.push();//入队
q.front();//访问队首元素
q.back();//访问队尾元素
q.pop();//移除队首元素

----\(˙<>˙)/----赞赏一下吧~