《算法笔记》第六章源代码

P191~197

#include<iostream>
#include<vector>
using namespace std;
int main(){
	vector<int> vi;//定义一个vector vector<typename> name
	vector<vector<int> > vo;//vector型vector vector<vector<int> >   > >之间有空格  横向延伸纵向也延伸
	vector<int> vt[100];//vector型二维数组 横向确定纵向延伸
	//通过下标访问 例如vi[n]
	//通过迭代器访问 vector<typename>::iterator it;
	//push_back(x)  在末尾添加一个元素x
	for(int i = 1; i <= 5; i++){
		vi.push_back(i);
	}// 1 2 3 4 5
	//pop_back()  删除尾元素
	vi.pop_back();//删除尾元素 5
	//vi.size() 获得vector中元素个数
	printf("%d\n",vi.size());//输出 4
	//clear()
	vi.clear();
	//begin() 返回首地址
	vector<int>::iterator it = vi.begin();
	for(int i = 0; i <= 5; i++){
		vi.push_back(i);
	}//0 1 2 3 4 5
	for(int i = 0; i < vi.size(); i++){
		printf("%d ",*(it + i));
	}
	printf("\n");
	//insert(it , x)在任意迭代器it处插入一个元素x
	vi.insert(it + 3, 10);
	for(int i = 0; i < vi.size(); i++){
		printf("%d ",*(it + i));
	}//0 1 2 10 3 4 5
	//erase(it) 删除迭代器为it处的元素
	vi.erase(it + 3);
	printf("\n");
	for(int i = 0; i < vi.size(); i++){
		printf("%d ",*(it + i));
	}//0 1 2 3 4 5
	//erase(frist, end) 删除[frist, end)的元素
	vi.erase(it + 1, it + 3);
	printf("\n");
	for(int i = 0; i < vi.size(); i++){
		printf("%d ",*(it + i));
	}//0 3 4 5
	return 0;
}

P198~201

#include<iostream>
#include<set>// set函数头
using namespace std;
int main(){
	//单独定义一个set set<typename> name
	set<int> st;
	// 定义set数组 set<typename> Arrayname[arraySize]
	set<int> a[100];
	//只能通过迭代器访问   set<sypename>::iterator it;
	//insert()   insert(x)可将x插入set容器中,并且自动增排序和去重
	st.insert(3);
	st.insert(5);
	st.insert(2);
	st.insert(3);
	for(set<int>::iterator it = st.begin(); it != st.end(); it++){
		printf("%d ", *it);
	}
	printf("\n");
	//输入了 3 5 2 3 去重排序后应为 2 3 5
	//find()  find(value)返回对应值为value的迭代器
	set<int>::iterator it = st.find(3);
	printf("%d\n", *it);
	//erase()  erase(it) it为所需删除元素的迭代器
	st.erase(it);
	for(set<int>::iterator it = st.begin(); it != st.end(); it++){
		printf("%d ", *it);
	}
	printf("\n");
	//此时序列为 2 3 5 it为3的迭代器 删除后应该为 2 5
	//erase()  erase(value) value为所需删除元素的值
	st.erase(2);
	for(set<int>::iterator it = st.begin(); it != st.end(); it++){
		printf("%d ", *it);
	}
	printf("\n");
	//此时序列为 2 5  删除2后应该为5
	st.insert(3);
	st.insert(7);
	st.insert(6);
	st.insert(2);
	for(set<int>::iterator it = st.begin(); it != st.end(); it++){
		printf("%d ", *it);
	}
	printf("\n");
	it = st.find(5);
	//erase(frist,last) 即删除迭代器地址为[frist,last)的元素
	st.erase(it, st.end());
	for(set<int>::iterator it = st.begin(); it != st.end(); it++){
		printf("%d ", *it);
	}
	printf("\n");
	//重新插入后序列为 2 3 5 6 7 it指向5的地址  删除后序列为2 3
	// size()  用来获得set内元素的个数
	int num = st.size();
	printf("%d\n", num);
	//此时set内有元素 2 3 个数应该为2
	// clear()  用来清空set内所以的元素
	st.clear();
	num = st.size();
	printf("%d\n", num);
	//此时set内元素被清空 个数应该为0
	return 0;
}

P202~209

#include<iostream>
#include<string>// string函数头文件
using namespace std;
int main(){
	// string name定义  或者string name = "xxxx" 直接初始化
	//可以和数组一样通过下标访问
	//读入和输出整个字符串 只能用cin 和 cout
	//输出时可以用c_str()将string类型转化为字符数组输出
	string str = "abcd";
	cout<<str<<endl;
	printf("%s\n", str.c_str());
	//通过迭代器访问
	for(string::iterator it = str.begin(); it != str.end(); it++){
		printf("%c", *it);
	}
	printf("\n");
	//string和vector一样 支持迭代器+ - 某个数字
	// string的加法
	string str1 = "efg";
	str += str1;
	cout<<str<<endl;
	//两个string类型可以直接比较大小 比较规则是字典序
	string str2 = "eff";
	if(str1 > str2){
		printf("efg>eff\n");
	}
	//length() 或者 size()返回string的长度
	printf("%d %d\n", str.length(), str.size());
	//insert(pos, string) 把string类型的所有元素全部插入到pos位
	str.insert(3, str1);
	cout<<str<<endl;
	// str: abcdefg  str1: efg  将str1插入到str的3号位即 c d 中间 输出abcefgdefg
	//insert(it, it1, it2) it为原字符串欲插入的位置 it1 it2 为待插入字符串的首位迭代器
	str = "abc";
	str1 = "xyz";
	str.insert(str.begin() + 2, str1.begin(), str1.end());
	cout<<str<<endl;
	//即将xyz插入到b c 之间
	//erase(it) it 为所要删除元素的迭代器
	str.erase(str.end() - 1);
	cout<<str<<endl;
	//删除了str的尾元素
	//erase(frist, last) frist last 都为迭代器 即删除地址为[frist, last) 的所有元素
	str.erase(str.begin() + 2, str.begin() + 4);
	cout<<str<<endl;
	//初始str: abxyz 上述操作删除了x y 注意z并没有被删除 输出 abz
	//erase(pos, length) 删除pos位后的length个字符
	str.erase(1, 2);
	cout<<str<<endl;
	//初始str: abz 上述操作删除了第1位a后面长度为2的字符 输出 a
	//clear() 清空所以字符
	str.clear();
	printf("%d\n", str.length());
	//substr(pos, length) 返回从pos为开始长度为length的字符串 只返回最近的那个
	str = "Thank you for your smile";
	cout<<str.substr(0, 5)<<endl;
	cout<<str.substr(14, 4)<<endl;
	cout<<str.substr(19, 5)<<endl;
	//string::npos 是一个常数 用以作为find函数失配时的返回值 可以认为值为-1或者4294967295
	if(string::npos == -1){
		printf("-1 is true.\n");
	}
	if(string::npos == 4294967295){
		printf("4294967295 is also true.\n");
	}
	//根据编译器不同string::npos == 4294967295可能结果不同
	//find(str1) 当str1是str的子串时 返回其在str中第一次出现的位置;如果str2不是str的子串 返回string::npos
	//find(str1, pos) 从str的pos位开始寻找
	str = "Thank you for your smile";
	str1 = "you";
	str2 = "me";
	if(str.find(str1) != string::npos){
		cout<<str.find(str1)<<endl;
	}//此时找到的是第一个you
		if(str.find(str1, 7) != string::npos){
		cout<<str.find(str1, 7)<<endl;
	}//此时找到的是your中的you
	if(str.find(str2) != string::npos){
		cout<<str.find(str2)<<endl;
	}else{
		cout<<"I know there is no position for me."<<endl;
	}
	//replace(pos, len, str2) 把str从pos位开始 长度为len的子串替换为str2
	//replace(it1, it2, str2) 把str的迭代器[it1, it2)范围内的子串替换为str2
	str = "Maybe you will turn around.";
	str1 = "will not";
	str2 = "surely";
	cout<<str<<endl;
	cout<<str.replace(10, 4, str1)<<endl;
	cout<<str.replace(str.begin(), str.begin() + 5, str2)<<endl;
	return 0;
}

P211~212

#include<iostream>
#include<string>
using namespace std;
int n;
string deal(string s, int& e){
	int k = 0;
	while(s.length() > 0 && s[0] == '0'){
		s.erase(s.begin());
	}	
	if(s[0] == '.'){
		s.erase(s.begin());
		while(s.length() > 0 && s[0] == '0'){
			s.erase(s.begin());
			e--;
		}
	}else{
		while(k < s.length() && s[k] != '.'){
			k++;
			e++;
		}
		if(k < s.length()){
			s.erase(s.begin() + k);
		}
	}
	if(s.length() == 0){
		e = 0;
	}
	int num = 0;
	k = 0;
	string res;
	while(num < n){
		if(k < s.length()){
			res += s[k++];
		}else{
			res += '0';
		}
		num++;
	}
	return res;
}
int main(){
	string s1, s2, s3, s4;
	cin >> n >> s1 >> s2;
	int e1 = 0, e2 = 0;
	s3 = deal(s1, e1);
	s4 = deal(s2, e2);
	if(s3 == s4 && e1 == e2){
		printf("YES 0.%s*10^%d\n", s3.c_str(), e1);
	}else{
		printf("NO 0.%s*10^%d 0.%s*10^%d\n", s3.c_str(), e1, s4.c_str(), e2);
	}	
	return 0;
}

P213~217

#include<iostream>
#include<map>//map函数头文件
using namespace std;
int main(){
	//map<typename1, typename2> mp;   typename1 与 typename2 分别为键key与值value的类型
	map<char, int> mp;
	//通过下标访问 map中键是唯一的!
	mp['c'] = 20;
	mp['c'] = 30;
	printf("%d\n", mp['c']);//输出30而不是20
	//通过迭代器访问
	mp['a'] = 20;
	mp['b'] = 10;
	for(map<char, int>::iterator it = mp.begin(); it != mp.end(); it++){
		printf("%c %d\n", it-> first, it -> second);
	}//由输出可知map会以键从小到大的顺序自动排序
	//find(key) 返回键为key的映射的迭代器
	map<char, int>::iterator it = mp.find('b');
	printf("%c %d\n", it-> first, it -> second); 
	//erase(it)  删除迭代器为it的元素
	mp.erase(it);//此时it为'b'的迭代器
	for(map<char, int>::iterator it = mp.begin(); it != mp.end(); it++){
		printf("%c %d\n", it-> first, it -> second);
	}
	//erase(key) key为欲删除的映射的键
	mp.erase('a');
	for(map<char, int>::iterator it = mp.begin(); it != mp.end(); it++){
		printf("%c %d\n", it-> first, it -> second);
	}
	//erase(first, last) 删除迭代器在区间[first, last)的映射
	mp['a'] = 20;
	mp['b'] = 10;
	mp['c'] = 30;
	it = mp.find('b');
	mp.erase(it, mp.end());
	for(map<char, int>::iterator it = mp.begin(); it != mp.end(); it++){
		printf("%c %d\n", it-> first, it -> second);
	}//只输出a 20
	//size() 用来获得map中映射的个数
	printf("%d\n", mp.size());
	//clear() 清空map中所有映射
	mp.clear();
	printf("%d\n", mp.size());//此时应该输出0
	return 0;
}

P218~220

#include<iostream>
#include<queue>//queue函数头文件
using namespace std;
int main(){
	//queue<typename> name; 定义一个queue队列
	//push(x)  将x进行入队
	//front() back() 分别获得队首和队尾元素
	queue<int> q;
	for(int i = 1; i <= 5; i++){
		q.push(i);
	}
	printf("%d %d\n", q.front(), q.back());
	//pop()令队首元素出队
	for(int i = 1; i <=3; i++){
		q.pop();
	}
	printf("%d %d\n", q.front(), q.back());
	//empty()  检测queue是否为空 返回true则空 返回false则非空
	queue<int> q1;
	if(q1.empty() == true){
		printf("Empty\n");
	}else{
		printf("Not empty\n");
	}
	q1.push(1);
	if(q1.empty() == true){
		printf("Empty\n");
	}else{
		printf("Not empty\n");
	}
	//size() 返回queue内元素的个数 
	printf("%d\n", q1.size());
	return 0;
}

P221~226

#include<iostream>
#include<queue>//priority_queue函数头文件
using namespace std;
struct fruit{
	string name;
	int price;
}f1, f2, f3;
struct cmp{
	bool operator ()(fruit f1, fruit f2){
		return f1.price < f2.price;
	}
};
int main(){
	//priority_queue<typename> name 定义一个优先队列
	//push(x) 令x入队
	//top() 访问队首元素
	//pop() 令队首元素出队
	priority_queue<int> q;
	for(int i = 1; i <= 3; i++){
		q.push(i);
	}
	printf("%d\n", q.top());
	q.pop();
	printf("%d\n", q.top());
	//empty() 检测队列是否为空
	priority_queue<int> q1;
	if(q1.empty() == true){
		printf("Empty\n");
	}else{
		printf("Not empty\n");
	}
	q1.push(1);
	if(q1.empty() == true){
		printf("Empty\n");
	}else{
		printf("Not empty\n");
	}
	//size() 返回优先队列内元素的个数
	printf("%d\n", q1.size());
	//优先级设置
	//priority_queue<typename1, vector<typename2>, cmp> name typename2 与 typename1 数据类型相同 cmp可以用greater<>或者less<>替代
	//使用greater<>时最小的优先级最高
	priority_queue<int, vector<int>, greater<int> > q_greater;
	q_greater.push(1);
	q_greater.push(2);
	q_greater.push(3);
	printf("%d\n", q_greater.top());
	//使用less<>时最大的优先级最高
	priority_queue<int, vector<int>, less<int> > q_less;
	q_less.push(1);
	q_less.push(2);
	q_less.push(3);
	printf("%d\n", q_less.top());
	//使用cmp  可见顶部对cmp结构体的定义  同时定义了fruit结构体
	priority_queue<fruit, vector<fruit>, cmp> q_fruit;
	f1 = {"桃子", 3};
	f2 = {"梨子", 4};
	f3 = {"苹果", 1};
	q_fruit.push(f1);
	q_fruit.push(f2);
	q_fruit.push(f3);
	printf("%s %d\n", q_fruit.top().name.c_str(), q_fruit.top().price);
	return 0;
}

P227~229

#include<iostream>
#include<stack>//stack函数头文件
using namespace std;
int main(){
	//stack本身是一种后进先出的数据结构 只能通过top()来访问栈顶元素
	//stack<typename> name 定义一个栈
	//push(x) 将x入栈
	//top() 获得栈顶元素
	//pop() 弹出栈顶元素
	stack<int> st;
	for(int i = 1; i <=5; i++){
		st.push(i);
	}//依次将 1 2 3 4 5入栈
	for(int i = 1; i <= 3; i++){
		st.pop();
	}//依次将 5 4 3 出栈
	printf("%d\n", st.top());//此时输出栈顶元素 2
	//size() 返回stack内栈的个数
	printf("%d\n", st.size());
	//empty() 检测stack内是否为空
	stack<int> st2;
	if(st2.empty() == true){
		printf("Empty\n");
	}else{
		printf("Not empty\n");
	}
	st2.push(1);
	if(st2.empty() == true){
		printf("Empty\n");
	}else{
		printf("Not empty\n");
	}
	return 0;
}

P230~232

#include<iostream>
#include<map>//#include<utility> 包含于map中
using namespace std;
int main(){
	//pair<typename1, typename2> name 定义一个pair
	//临时构建一个pair有两种方式
	//pair<typename1, typename2>( 对应类型的元素,对应类型的元素)
	//make_pair(元素, 元素)
	//pair 通过 first second 访问
	pair<string, int>p("haha", 5);
	printf("%s %d\n", p.first.c_str(), p.second);
	p = make_pair("xixi", 55);
	printf("%s %d\n", p.first.c_str(), p.second);
	p = pair<string, int>("heihei", 555);
	printf("%s %d\n", p.first.c_str(), p.second);
	//pair可以直接通过< <= 等比较大小 先比较first 再比较second
	return 0;
}

P233~244

#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
using namespace std;
bool cmp(string a, string b){
	//长度从小到大 字典序从大到小排序
	if(a.length() != b.length()){
		return a.length() < b.length();
	}else{
		return a > b;
	}
}
int main(){
	//max(x, y) 返回x y中最大者的值
	//min(x, y) 返回x y中最小者的值
	//abs(x)    返回x的绝对值
	//swap(x, y) 交换 x y 的值
	//reverse(it, it2) 可以将数组指针在[it, it2)之间的元素或者容器的迭代器在[it, it2)范围内的元素进行反转
	//next_permutation() 给出一个序列在全排列中的下一个序列
	int a[3] = {1, 2, 3};
	do{
		printf("%d %d %d\n", a[0], a[1], a[2]);
	}while(next_permutation(a, a + 3));//next_permutation()在已经达到全排列的最后一个时会返回false,方便退出循环
	//fill() 可以把数组或者容器中某一段区间赋某个相同的值 和memset不同 这里的赋值可以是数组类型对应范围中的任意值 区间符合左闭右开原则
	fill(a, a + 2, 5);
	for(int i = 0; i < 3; i++){
		printf("%d ", a[i]);
	}
	printf("\n");
	//sort(首元素地址, 尾元素地址的下一个地址, 比较函数(非必须))  默认从小到大
	//比较函数返回值 a > b 则递减 a < b 则递增
	//对于结构体需要利用条件语句分级讨论
	//在STL标准容器中 只有vector string deque是可以使用sort的 而set map这种容器是用红黑树实现的 本身有序 故不允许使用sort排序
	//以vector为例
	vector<int> vi;
	vi.push_back(1);
	vi.push_back(3);
	vi.push_back(2);
	sort(vi.begin(), vi.end() );//未插入cmp 默认从小到大排序
	for(int i = 0; i < 3; i++){
		printf("%d ", vi[i]);
	}
	printf("\n");
	//以string为例
	string str[3] = {"bbb", "cc", "aaa"};
	sort(str, str + 3, cmp);
	for(int i = 0; i < 3; i++){
		printf("%s\n", str[i].c_str());
	}
	//lower_bound(first, last, val) 用来寻找数组或者容器的[first, last)范围内第一个值大于等于val的元素的位置 返回该位置的指针或者迭代器
	//upper_bound(first, last, val) 用来寻找数组或者容器的[first, last)范围内第一个值大于val的元素的位置 返回该位置的指针或者迭代器
	
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值