12. STL初识

长久以来,软件界一直希望建立一种可重复利用的东西

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
// class186_STL初识vector.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#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
// class186_STL初识vector.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#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
// class186_STL初识vector.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#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();
}

12. STL初识
http://binbo-zappy.github.io/2024/11/27/cpp/12-STL初识/
作者
Binbo
发布于
2024年11月27日
许可协议