标准模板库

前言

正向编程程序员无需了解STL的原理。只需要培养在不同的需求中选择合适的集合类算法这一能力即可。如此的灵活性导致了STL并不好懂,所以要对自己有耐心啊。STL的使用范围很广,所以必须要100%掌握啊!

一.容器
0x1.根据需求选择合适的容器

一般C++的数据结构数据类型是绑定在一起的(声明的时候就已经和类型绑定了)。然而通过模板技术,可以把数据类型当成参数抽离出来,就剩下了结构,结构构成的这个东西就叫做容器。相当于现实生活中的杯子。
在这里插入图片描述

序列式容器:
Array:允许随机访问;创建时必须指定其大小;只能改变元素值;
Vector:允许随机访问;尾插或移除元素都很快速,中插或头插元素比较费时
Deque:头插和尾插十分迅速,中插比较费时;
List:不提供随机访问;在任何位置上执行插入或删除行为都非常迅速;

#include <iostream>
#include <string>
#include <vector>
#include <deque>
#include <array>
#include <list>
#include <forward_list>
using namespace std;	
int main(int argCount, char* argv[], char* env[])
{ 
	vector<int> coll;
	deque<double> coll2;
	array<string, 5> coll3 = { "cxz","wutongshan" };
	list<char> coll4;
	forward_list<long> coll5{ 2,3,5,7,11,13,17 };
	
	for (int i = 1; i < 6; i++) coll.push_back(i);
	for (int i = 0; i < coll.size(); i++) cout << coll[i] << " "; cout << endl;

	for (int i = 1; i <= 6; i++) coll2.push_front(i * 1.1);
	for (int i = 0; i < coll2.size(); i++) cout << coll2[i] << " "; cout << endl;

	for (int i = 0; i < coll3.size(); i++) cout << i << ":" << coll3[i] << "  "; cout << endl;
	
	for (char c = 'a'; c < 'z'; c++) coll4.push_back(c);
	for (auto elem : coll4) cout << elem; cout << endl;
	
	coll5.resize(9);
	coll5.resize(10, 99);
	for (auto elem : coll5) cout << elem << " ";

}

关联式容器容器:

Set:元素依据其value自动排序,每个元素只能出现一次,不允许重复
Multiset:元素可以重复
Map:每个key只能出现一次,不允许重复;
Multimap:key允许重复,可以出现多次,;

#include <iostream>
#include <string>
#include <set>
#include <map>
using namespace std;	
int main(int argCount, char* argv[], char* env[])
{ 
	unordered_multiset<string> cities{ "1","2","3","4","5","6","7","8" };
	unordered_set<string> cities2{ "1","2","3","4","5","6","7","8" };
	multimap<int, string> collA{ {5,"tagged"},{2, "a"},{1,"this"},{4,"of"},{6,"strings"},{1,"is"},{3,"multimap"}, {3,"multimap"} };
	map<int, string> collB{ {5,"tagged"},{2, "a"},{1,"this"},{4,"of"},{6,"strings"},{1,"is"},{3,"multimap"}, {3,"multimap"} };

	for (auto elem : collA) cout << elem.second << " " ; cout << (char)10;
	for (auto elem : collB) cout << elem.second << " "; cout << (char)10;
	
	cout << (char)10;
	for (const auto& elem : cities) cout << elem << " "; cout << (char)10;
	for (const auto& elem : cities2) cout << elem << " ";cout << (char)10;

	cities.insert({ "9", "10", "8" });
	cities2.insert({ "9", "10", "8" });
	for (const auto& elem : cities) cout << elem << " "; cout << (char)10;
	for (const auto& elem : cities2) cout << elem << " ";
}

无序容器:

unordered_set:不允许元素重复;次序不明确
unordered_multiset:允许元素重复`;
unordered_map:每个key只可出现一次,;
unordered_multimap

#include <iostream>
#include <string>
#include <unordered_set>
#include <set>
#include <unordered_map>
#include <map>

using namespace std;	
int main(int argCount, char* argv[], char* env[])
{
	unordered_set<string> cites = { "1","2","3","3" };
	multiset<string> cites2 = { "1","2","3","3" };
	unordered_map<string, double> coll{ {"tim", 9.9},{"tim", 9.9}, {"struppi", 11.77} };
	multimap<string, double> coll2{ {"tim", 9.9}, {"tim", 11.77} };

	for (const auto& elem : cites) cout << elem << " "; cout << endl;
	for (const auto& elem : cites2) cout << elem << " "; cout << endl;
	for (pair<const string, double>& elem : coll) elem.second *= elem.second;
	for (pair<const string, double>& elem : coll2) elem.second *= elem.second;

	cites.insert({ "6", "t", "c" });
	cites2.insert({ "6", "t", "c" });
	for (const auto& elem : cites) cout << elem << " "; cout << endl;
	for (const auto& elem : cites2) cout << elem << " "; cout << endl;
	for (const auto& elem : coll) cout << elem.first << ": " << elem.second << " "; cout << endl;
	for (const auto& elem : coll2) cout << elem.first << ": " << elem.second << " "; cout << endl;

}
0x2.选择声明/定义的内存区域
0x3.确定这个变量所起的作用(算法阶段)
二.迭代器
三.算法

目标:培养遇到某些具体问题时选择最适用的算法这种能力。不要死记硬背。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值