C++STL笔记整理以及vector举例

 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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值