吴良超的学习笔记

C++ 一些基本语法

本文主要涉及到 C++ 一些基本语法,在做 oj 时经常用到,特此记录。

字符和字符串

  • 数字转字符串:std::to_string(int)
  • 字符串转数字:std::stoi(string)

上面两个函数均需要 #include<string>

  • 字符串可以用数组方式来访问
  • 字符串长度可用其length()函数获取
  • 字符串可以通过substr(i,n)方法来提取子字符串,表示从第i个字符开始提取n个字符(包括i)
  • 字符串大小写转换:利用STL中的transform函数,见下面的例子
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;

int main(){
string s = "abcdEFg";
transform(s.begin(), s.end(), s.begin(), ::toupper);
cout << s<<endl; //输出ABCDEFG
transform(s.begin(), s.end(), s.begin(), ::tolower);
cout << s << endl; //输出abcdefg
return 0;
}
  • 单个字符大小写转换
    • 需要记住ASCII码中A-65,a-97
    • 将char c从大写转为小写可以通过下面代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
if(c>='A' && c<='Z')
c=char(c+32);
```

- 数字从char类型转为int类型
- 需要记住0对应的ASCII码为48
- 一个简单的例子如下

```cpp
char c='0';
int a=int(c);
cout<<a<<endl; //输出48
int b=int(c)-48;
cout<<b<<endl; //输出0

数组

初始化数组(不初始化时为随机的地址值)

  • 方法一:直接用数值初始化,见下面代码
    1
    2
    3
    int a[3]={1,2,3} //元素依次为1,2,3
    int a[3]={0} //元素依次为0,0,0
    int a[3]={1} //元素依次为1,0,0

采用这种方法初始化时如果{}里面的元素的个数小于数组长度,则不足长度的元素默认值为0

  • 方法二:for循环

    动态分配数组长度方法(一维)

    • 方法一:通过vector实现,需要#include < vector >
    • 方法二:通过malloc和free实现,如下面例子就初始化了一个长度为n的数组,且数组的值为从0到n-1(这个是继承了C分配内存的特性,C++可通过newdelete来实现,见方法三)
1
2
3
4
5
cin>>n;
int *a=(int *)malloc(sizof(int)*n);
for(int i=0;i<n;i++)
a[i]=i;
free(a);
  • 方法三:通过newdelete来实现,见下面代码
1
2
3
4
5
cin>>n;
int *a=new int[n];
for(int i=0;i<n;i++)
a[i]=i;
delete []a;

容器

vector

  • 需要 #include <vector>
  • vector的方法:
    • vector中的元素可以以数组下标访问
    • push_back( ) 将一个元素放到vector中
    • vector.size( ) 获取vector的大小
    • 查找元素t是否在vector中
1
2
3
4
T t;
vector<T>::iterator it=find(vector.begin( ),vector.end( ),t);
if(it == vector.end( ) )
cout<<"not found";
  • 其他方法(需要 #include <algorithm>):
    • sort(vector.begin( ),vector.end( ) ) //针对vector数据类型的排序
    • reverse(vector.begin( ),vector.begin( )+5 ) //针对vector数据类型的 反转 ,注意:reverse(vector.begin(),vector.begin()+5) 仅仅对5个元素进行reverse操作,不包括vector.begin()+5

map

  • 需要 #include <map>
  • 用数组下标的形式往map中添加元素和查找元素
  • 当map的key为结构体类型时,可通过重载 < 来判断该如何排序,见下面的代码
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
#include <iostream>
#include <map>
using namespace std;

struct stu{
string name;
int sco;
/*重载运算符 <,达到从大到小或从小到大的排序效果,下面的代码是从小到大,如改成 return a.sco >b.sco 则是从大到小 */
friend bool operator < (const stu &a, const stu &b){
return a.sco < b.sco;
}
};

int main(){
map<stu, int> score;
stu tmp;
for (int i = 0; i < 10; i++){
tmp.name = to_string(i);
tmp.sco = i;
score[tmp] = i+1;
}
//获取顺序排列时的第一个元素,从大到小还是从小到大要看重载的<
map<stu, int>::iterator it = score.begin();
cout << it->first.name << ' '<<it->second << endl;
//获取逆序排序的第一个元素,从大到小还是从小到大要看重载的<
map<stu,int>::reverse_iterator rit = score.rbegin();
cout << rit->first.name << ' ' << rit->second << endl;
return 0;
}
  • 遍历map
1
2
3
4
map<T,T> m;
map<T,T>::iterator it;
for(it=m.begin();it!=m.end();it++)
cout<<it->first<<':'<<it->second<<endl;

输入输出

  • printf函数格式化数字的输出
  • 数字前补0到达指定位数:

    • 1
      2
      int a=3,b=4;
      printf("%04d %05d %d",a,b,b) //输出为 `0003 00004 4`
  • 可通过scanf从输入的一定格式的字符串中提取数字如:

1
2
int year,month,day;
scanf("%d/%d/%d",&year,&month,&day); //输入2014/09/06时,year=2014,month=9,day=6
  • cin或cout的类型为string时需要include
    • 结构体的数据类型可以是别的结构体,也可以是自身结构体的指针
    • 结构体内部也可以放函数,函数可用来初始化一个结构体