C2Cpp总结
没系统的学,有些东西是自己的理解,不一定对.
01.命名空间
using namespace std;
std命名空间是C++中标准库类型对象的命名空间。
02.C头文件
#incude<stdio.h> // C
#include<cstdio> // Cpp
去掉 .h
加上 c
03.变量声明
bool a = true; // 非0为true,0为false
string b = "Hello World!"; // 不是一个标准数据类型。
多了 bool
和 string
两个类型可以声明.
使用 string
时需要引入 string
头文件
04.结构体
struct stu {
string name;
int age;
};
stu stuList[10];
如你所见,不用 typedef
了,可以直接省去 struct
.
05.引用
void swap(int &a,int &b){
int temp = 0;
temp = a;
a = b;
b = temp;
}
swap(a,b);
上面这个swap函数也能实现a和b交换.在C中,这个函数需要传入a和b的地址,用指针来实现.
指针和引用的区别(个人理解,可以参考{C++ 中指针和引用的区别 | 菜鸟教程}):
&a 传入时传入 a
*a 传入时传入 &a
引用可以认为是const指针,他的地址没法被修改.
06.vector - 向量
使用前需要引入 vector
头文件
定义和初始化
vector <int> a(10,1); // 十个元素的数组,所有元素初始化为1
vector <int> b(10); // 十个元素的数组,默认初始化为0
vector <int> c; // 零个元素的数组
方法
// 假设a是int型向量
a.resize(int); // 重新设定大小
a.size(void); // 获取容器大小
a.push_back(int); // 在末尾添加元素(自动扩容)
07.set - 集合
使用前需要引入 set
头文件
定义
// 有互异性 不能初始化 会自动从小到大排序
set <int> a;
a.insert(3);
a.insert(2);
a.insert(1);
遍历
// 迭代器 (end()返回这个集合最后一项的下一项的指针)
for(auto p = a.begin(); p != a.end() ; p++){
cout << *p << endl;
}
方法
// 假设a是int型集合
a.insert(int); // 插入
a.find(int); // 在a中寻找,返回指针
a.erase(int); // 在a中删除
a.size(void); // 获取容器大小
08.map - 键值对
使用前需要引入 set
头文件
定义和初始化
// 会自动从小到大排序
/*
struct {
string first;
int second;
}
*/
map <string,int> a;
a["王麻子"] = 18;
a["李四"] = 18;
a["张三"] = 18;
遍历
for(auto p = a.begin(); p != a.end(); p++){
cout << p -> first << "的年龄是" << p -> second << "岁" << endl;
}
方法
a.size(void); // 获取容器大小
09.stack - 栈
使用前需要引入 stack
头文件
- 先进后出
- 只能查看栈顶
定义
stack <int> a;
方法
push(int); // 压栈
pop(void); // 出栈
top(void); // 栈顶
a.size(void); // 获取容器大小
10.queue - 队列
使用前需要引入 queue
头文件
- 先进先出
- 只能查看队列首尾
定义
queue <int> a;
方法
push(int); // 尾部添加
front(void); // 查看顶部
back(void); // 查看尾部
pop(void); // 删除队首的元素
a.size(void); // 获取容器大小
11.unordered - 无序
使用前需要引入 unordered_map or unordered_set
头文件
这俩和 map
set
用法一样,只不过不排序
12.bitset - 位操作
使用前需要引入 bitset
头文件
定义和初始化
bitset <4> a; // 0000
bitset <4> b(7); // 0111
bitset <4> c("101"); // 0101
bitset <5> d("101"); // 00101
string i = "01011101";
bitset <4> e(i,2,3); // 从i的第二位读三个进来
方法
to_ulong(void); // 转化为十进制(unsigned long)
any(void); // 是否有1
none(void); // 是否没1
count(void); // 有几个1
test(int); // 某号位置是否为1
flip(void); //取反
flip(int); // 某号位置取反
empty(void); // 归零
empty(int); // 某号位置归零
a.size(void); // 获取容器大小
13.sort - 排序
使用前需要引入 sort
头文件
使用方法
/*排序,从小到大*/
sort(arr.begin(),arr.end()); // [begin,end)
自定义排序规则
/*
自定义排序规则
返回1则排序
返回0则不排序
*/
bool cmp(stu a,stu b){
/*
自定义的排序规则
先按年龄从大到小排序
年龄相同则按姓名排序
年龄姓名均相同不排序
*/
if(a.age != b.age){
return a.age < b.age;
}else if(a.name != b.name){
return a.name < b.name;
}else{
return 0;
}
}
stu stuList[3] = {
{"张小龙",18},
{"李小帅",19},
{"张大龙",18},
};
sort(stuList,stuList+3,cmp);
14.cctype头文件
使用前需要引入 cctype
头文件
isalpha(char); // 是否为字母
isupper(char); // 是否为大写字母
islower(char); // 是否为小写字母
isalnum(char); // 是否为字母或数字
isspace(char); // 是否为空格或\n\t\r
toupper(char); // 转换成大写字母
tolower(char); // 转换成小写字母
15.c++11的新特性
01.auto声明
// 直接判断数据类型
auto a = 1; // 整数
auto b = .1; // 浮点数
auto c = .0; // 必须初始化
cin >> c;
cout << c << endl;
// 用于迭代器
vector <int> d(10,1);
for(auto p = d.begin(); p != d.end(); p++){
cout << *p << endl;
}
02.基于范围的for循环
#include<iostream>
#include<vector>
using namespace std;
int main(void)
{
vector <int> a(5,1);
cout << "------------------" << endl;
for(auto value:a){
value++; // value只是a[xxx]的一个副本,修改它不会对a产生任何影响
cout << value << endl;
}
cout << "------------------" << endl;
for(auto value:a){
cout << value << endl;
}
cout << "------------------" << endl;
for(auto &value:a){
value++; // 取地址,修改它会对a产生任何影响
cout << value << endl;
}
cout << "------------------" << endl;
for(auto value:a){
cout << value << endl;
}
cout << "------------------" << endl;
return 0;
}
03.to_string
把一个其他类型的数据转换成字符串.
float a = .1;
string s = to_string(a);
04.stoi_stod
把字符串转换成其他数据类型.
- stoi: string to int
- stod: string to double
- 其他的还有: stof/stold/stol/stoll/stoul/stoull
int a = stoi("123");
cout << a-- << endl; // 123
cout << a << endl; // 122
double b = stod(".123");
cout << b++ << endl; // 0.123
cout << b << endl; // 1.123