1.STD的诞生
长久以来,软件界一直希望建立一种可以重复利用的东西,c++的面向对象和泛型编程思想,目的就是复用性的提升,大多数情况下,数据结构和算法都没有一套标准,导致被迫从事大量重复工作,为了建立数据结构和算法的一套标准,诞生了STR
2.STR基本概念
全称:standdard template library
广义上分为容器,算法,迭代器
容器和算法之间通过迭代器进行无缝衔接
STR几乎所有的代码都采用了类模板和函数模板
3.STR六大组件
-
容器:各种数据结构:如string,vector,list,deque,set,mapde等,用来存放数据,容器内部存放的数据可以自己规定,可以是int,char等等,当然也可以自己去定义一个类,甚至可以用一个容器作为类型传给容器。
-
算法:各种常用的算法,如:sort,find,copy,for-each,需要使用#include<orgrithm>头文件才能使用
-
迭代器:扮演容器与算法之间的胶合器
-
仿函数:行为类似函数,可作为算法的某种策略
-
适配器:一种用来修饰仿函数和迭代器的接口的东西
-
空间配置器:负责空间的配置与管理
4.STR中容器,算法,迭代器
容器:用来存放数据
STR容器就是运用最广的一些数据结构实现出来
常用的数据类型:数组,链表,数,栈,队列,集合,映射表等
这些容器分为序列式容器和关联式容器:
序列式容器:强调值的排序,序列式容器中每个元素有固定的位置
关联式容器:二叉树结构,各元素间没有严格上的物理颠倒关系
算法:用来解决问题
有限的步骤,解决逻辑或数学上的问题,这一门学科称为算法
算法分为质变算法和非质变算法
质变算法:是指运算过程中会更改区间内元素的内容,例如拷贝,替换,删除
非质变算法:是指运算过程中不会更改区间内的元素内容,例如查找,计数,遍历,寻找极值
迭代器:容器和算法之间的粘合剂
提供一种方法,使之能够依序寻访某个容器中的各个元素,而又无需暴露该容器的内部表达方式
每个容器有自己专属的迭代器
迭代器使用类似于指针
5.选用vector作为例子介绍
1.基本概念
功能:与数组十分类似,又被称为单边数组或者就是C++风格的数组
与普通数组区别:C风格数组是静态空间,vector可以动态扩展
动态扩展:并不是在原空间后续接新空间,而是找更大的内存空间,然后将原数据拷贝新空间,释放原空间
vector的迭代器是支持随机访问的迭代器
2.vector构造函数
vector<数据类型如int>v1;默认无参构造,v1是这个容器的名字
vector<数据类型如int>v2(v1.begin(),v1.end())通过区间方式构造
初始化构造例如:vector<int>v3(10,100);传了十个一百到vector容器中
3.vector容器的容量和大小操作
v1.empty()如果v1为空返回false;
表示容量v1.capacity()
表示大小v1. size()
指定容器大小v1.resize()改变大小但是容量不变
指定大小如果大于了原容器,多出部分用0填充
可以指定填充v1.resize(5,100)
如果指定大小小于原容器,超出的部分删除掉
4.vector容器插入和删除
注意:插入容器的元素必须与定义的时候<>里面的数据类型相同
尾插v1.push-back(i)从尾部插入一个为i的数,即每个新插入的与元素会排列在之前插入的元素后面
尾删v1.pop-back(v1)
插入v1.insert(v1.begin) 第一个参数必须是迭代器
插入的重载用法v1.insert(v1.begin(),2,1000),在第一个数前插入两个1000
删除v1.erase(v1.begin())参数也是迭代器
如果v1.erase(v1.begin(),v1.end()),则是清空,相当于v1.clear()
5.vector容器数存取
访问:用v1[1]访问(与C风格数组访问规则一样)
获取第一个元素:v1.front();
访问最后一个元素:v1.back()
7.vector函数互换器
实现两个容器内部元素互换
v1.swap(v2)
使用:巧用swap收缩内存
8.预留空间
减少vector在动态扩展时的扩展次数
v1.reserve(100000)预留好了100000容量的空间
6.使用vector
#include<iostream>
using namespace std;
#include<algorithm>
#include<vector>
class person{
public:person(string name,int age) {
this->name=name;
this->age = age;
}
string name;
int age;
};
void text() {
vector<person>v;
person p1("aaa", 17);
person p2("aaa", 17);
person p3("aaa", 17);
person p4("aaa", 17);
v.push_back(p1);
v.push_back(p2);
v.push_back(p3);
v.push_back(p4);
for (vector<person>::iterator it = v.begin(); it != v.end(); it++) {
cout <<"姓名:"<<(*it).name <<"年龄:" <<it->age<< endl;
}
}
void text2() {
vector<person*>v;
person p1("aaa", 17);
person p2("aaa", 17);
person p3("aaa", 17);
person p4("aaa", 17);
v.push_back(&p1);
v.push_back(&p2);
v.push_back(&p3);
v.push_back(&p4);
for (vector<person*>::iterator it=v.begin(); it != v.end(); it++) {
cout << "姓名:" << (*it)->name << endl;
cout << "年龄:" << (*it)->age << endl;
}
}
int main() {
text(); text2();
system("pause");
return 0;
}