【算法竞赛入门经典】第五章知识点

本文介绍了从C到C++的关键转变,包括C++的输入输出、名称空间、const常数数组、引用传递、string类型、结构体和模板。深入探讨了STL,讲解了sort、lower_bound等排序检索操作,vector、set、map的使用,以及stack、queue、priority_queue等容器,并通过随机数生成展示了STL的实际应用。
摘要由CSDN通过智能技术生成

第五章 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

set用法

5.2.4 STL之 映射:map

map用法

5.2.5 STL之 栈、队列、优先队列

stack、queue、priority_queue用法

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值