长久以来,软件界一直希望建立一种可重复利用的东西
C+的面向对象和泛型编程思想,目的就是复用性的提升
大多情况下,数据结构和算法都未能有一套标准,导致被迫从事大量重复工作
为了建立数据结构和算法的一套标准,诞生了ST礼
STL(Standard Template Library,标准模板库)
STL从广义上分为:容器(container)算法(algorithm)迭代器(iterator)
容器和算法之间通过迭代器进行无缝连接。
STL几乎所有的代码都采用了模板类或者模板函数
STL大体分为六大组件,分别是:容器、算法、迭代器、仿函数、适配器(配接器)、空间配置器
1.容器:各种数据结构,如vector、.list、deque、set、map等,用来存放数据。
2.算法:各种常用的算法,如sot、find、copy、for_each等
3.迭代器:扮演了容器与算法之间的胶合剂。
4.仿函数:行为类似函数,可作为算法的某种策略。
5.适配器:一种用来修饰容器或者仿函数或迭代器接口的东西。
6.空间配置器:负责空间的配置与管理。
容器:置物之所也
I
STL容器就是将运用最广泛的一些数据结构实现出来
常用的数据结构:数组,链表,树,栈,队列,集合,映射表等
这些容器分为序列式容器和关联式容器两种:
序列式容器强调值的排序,序列式容器中的每个元素均有固定的位置。
关联式容器:二叉树结构,各元素之间没有严格的物理上的顺序关系
算法:问题之解法也
有限的步骤,解决逻辑或数学上的问题,这一门学科我们叫做算法Algorithms)
算法分为:质变算法和非质变算法。
质变算法:是指运算过程中会更改区间内的元素的内容。例如拷贝,替换,删除等等
非质变算法:是指运算过程中不会更改区间内的元素内容,例如查找、计数、遍历、寻找极值等等
2.1 容器算法迭代器
2.1.1 vector存放内置数据类型
容器:
vector
算法:
for_each
迭代器:
vector:iterator
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
|
#include <iostream> #include <vector> #include <algorithm> using namespace std;
void myPrint(int val) { cout << val << endl; }
int main() { vector<int> v; v.push_back(10); v.push_back(20); v.push_back(30); v.push_back(40);
vector<int>::iterator itBegin = v.begin(); vector<int>::iterator itEnd = v.end(); while (itBegin != itEnd) { cout << *itBegin << endl; itBegin++; } for (vector<int>::iterator it = v.begin(); it != v.end(); it++) { cout << *it << endl; } for_each(v.begin(), v.end(), myPrint); }
|
2.1.2 vector存放自定义数据类型
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
|
#include <iostream> #include <vector> #include <algorithm> using namespace std;
class Person { public: Person(string m_name, int m_age) :name(m_name), age(m_age) {} string name; int age; }; void myPrint(Person& p) { cout << p.name << " "<< p.age << endl; } void myPrint2(Person* p) { cout << p->name << " " << p->age << endl; } void test() { vector<Person*> v; Person p1("a", 10); Person p2("b", 10); Person p3("c", 10); Person p4("d", 10); Person p5("e", 10);
v.push_back(&p1); v.push_back(&p2); v.push_back(&p3); v.push_back(&p4); v.push_back(&p5);
for (vector<Person*>::iterator it = v.begin(); it != v.end(); it++) { cout << (**it).name << " " << (**it).age << endl; } for_each(v.begin(), v.end(), myPrint2); }
int main() { vector<Person> v; Person p1("a", 10); Person p2("b", 10); Person p3("c", 10); Person p4("d", 10); Person p5("e", 10);
v.push_back(p1); v.push_back(p2); v.push_back(p3); v.push_back(p4); v.push_back(p5);
for (vector<Person>::iterator it = v.begin(); it != v.end(); it++) { cout << (*it).name << " " << (*it).age << endl; } for_each(v.begin(), v.end(), myPrint); test(); }
|
2.5.3 Vector容器嵌套容器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
|
#include <iostream> #include <vector> #include <algorithm> using namespace std;
void test() { vector<vector<int>>v; vector<int> v1; vector<int> v2; vector<int> v3; vector<int> v4;
for (int i = 0; i < 4; i++) { v1.push_back(i + 1); v2.push_back(i + 2); v3.push_back(i + 3); v4.push_back(i + 4); } v.push_back(v1); v.push_back(v2); v.push_back(v3); v.push_back(v4);
for (vector<vector<int>>::iterator it = v.begin(); it != v.end(); it++) { for (vector<int>::iterator itt = (*it).begin(); itt != (*it).end(); itt++) { cout << *itt << " "; } cout << endl; } }
int main() { test(); }
|