文章目录
第五章 C++与STL入门
5.1 从C到C++
1、C++避免了C语言中long long类型输入输出占位符不匹配的问题:
//C++的long long:
long long a,b;
while(cin>>a>>b)
cout<<min(a,b)<<endl;
cin>>a的意思是:从标注输入中读取a,返回值是一个已经读取了a的新流,然后从这个新流中继续读取b。如果流已经读完,while循环将退出。
2、C++使用名称空间
使用using namespace std;就可以用cin代替std::cin,cout代替std::cout
3、C++声明数组时,数组大小可以用const声明的常数,不需要再用#define
const int maxn = 100
int a[maxn];
4、C++函数参数中的引用传递 VS C函数参数中的引用传递
//C++的swap2函数,更加简单
void swap2(int& a, int& b) {
int t = a; a = b; b = t;
}
int main() {
int a = 3, b = 4;
swap2(a, b);
cout<<a<<' '<<b<<endl;
return 0;
}
//C的swap2函数,更加麻烦
void swap2(int* a, int* b) {
int t = *a; *a = *b; *b = t;
}
int main() {
int a = 3, b = 4;
swap2(&a, &b);
cout<<a<<' '<<b<<endl;
return 0;
}
5、C++的string类型:string类型用法:构造、操作符、append、erase、find、insert等
//string类型的输入输出测试
string line;
cout<<"Test 1: cin & cout"<<endl;
cin>>line; //cin遇到空格、换行、tab等空白符就停止读取
cout<<line<<endl;
cout<<endl<<"Test 2: getline()"<<endl;
while(getline(cin, line)) { //getline则可以读取一整行,遇到换行才停止读取
cout<<line<<endl;
}
6、C++中的结构体:
可以拥有构造函数、可以重载运算符(以使用±*/)、可以定义流输出模式(以使用cout)
#include <iostream>
using namespace std;
struct Point {
int x, y;
Point(int x=0, int y=0):x(x),y(y) {} //构造函数,默认值初始化,无分号
}; //这里有分号
//重载'+'运算符,为Point定义加法
Point operator + (const Point& A, const Point& B) {
return Point(A.x+B.x, A.y+B.y);
}
//重载输出运算符'<<',为Point定义流输出方式
ostream& operator << (ostream& out, const Point& p) {
out << '(' << p.x << ',' << p.y << ')';
return out;
}
int main() {
Point a; //调用了构造方法Point(),x和y默认为0
Point b(1,2); //调用了构造方法Point(1,2)
cout<< a+b <<endl;
return 0;
}
输出:
(1,2)
7、C++中的模板 template:写结构体和函数时可以不拘泥于数据类型,在调用它们时才临时决定数据类型。
比如vector,在使用时可以用int类型声明vector v;也可以用double类型vector v;根据使用需要而决定。
//模板的写法
template <typename T> //有点像typedef,但完全不同
struct Point {
T x,y; //模板类型,可以被替换成int等
Point(T x=0, T y=0):x(x),y(y) {}
};
template <typename T> //每一处模板都要写这句
Point<T> operator + (const Point<T>& A, const Point<T>& B) {
return Point<T>(A.x+B.x, A.y+B.y);
}
template <typename T>
ostream& operator << (ostream& out, const Point<T>& p) {
out << '(' << p.x << ',' << p.y <<')' ;
return out;
}
int main() {
Point<int> a(1, 2), b(3, 4); //使用int类型的模板
Point<double> c(1.1, 2.2), d(3.3, 4.4); //使用double类型的模板
cout<< a+b << endl << c+d <<endl;
return 0;
}
输出:
(4,6)
(4.4,6.6)
5.2 STL初步
STL = standard template library STL简介_菜鸟教程
5.2.1 STL之 排序与检索:
1、sort(排序)
sort函数使用总结:数组、string、结构体
sort函数使用总结:vector、set
2、lower_bound(检索):i = lower_bound(a, a+n, x) - a
,查找“>=x的一个位置”
3、unique:删除有序数组中的重复元素
5.2.2 STL之 不定长数组:vector
vector用法:初始化、insert、erase、添加元素、读取元素
vector用法2
5.2.3 STL之 集合:set
5.2.4 STL之 映射:map
5.2.5 STL之 栈、队列、优先队列
5.2.6 测试STL:随机数生成
//测试sort函数
#include <cstdlib>
//rand()生成一个[0, RAND_MAX]内的均匀随机整数,RAND_MAX至少为32767 = 2^15-1
//rang()/RAND_MAX*n可以得到[0, n]之间的均匀整数
#include <ctime>
//srand(time(NULL))可以初始化“随机数种子”
#include <cassert>
//assert宏:当表达式为真时无变化,当表达式为假时终止程序,并且给出错误提示
//随机程序
void fill_random_int(vector<int>& v, int cnt) {
v.clear();
for(int i=0; i<cnt; i++)
v.push_back(rand());
}
//测试程序
void test_sort(vector<int>& v) {
sort(v.begin(), v.end());
//v.push_back(-100);
//如果不注释上面那句,将会报错:【Assertion failed: v[i] <= v[i+1],
//file C:\Users\summer\Desktop\test\main.cpp, line 25】
for(int i=0; i<v.size()-1; i++)
assert(v[i] <= v[i+1]);
}
//主程序
int main() {
vector<int> v;
srand(time(NULL));
fill_random_int(v, 10000);
test_sort(v);
return 0;
}