前言
正向编程
程序员无需了解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
.确定这个变量所起的作用(算法阶段)
二.迭代器
三.算法
目标:培养遇到某些具体问题时
选择
最适用的算法这种能力
。不要死记硬背。