初识STL
STL(Standard Template Library,标准模板库)六大组件:容器,算法,迭代器,仿函数,适配器,空间配置器。
容器
STL容器即将数据结构实现出来,根据“数据在容器中的排列”特性,这些数据结构可分为序列式和关联式两种。从实现角度看,容器为class template.
容器分类
容器大概也分为序列式容器和关联式容器两种。
所谓序列式容器,又叫顺序容器,其中的元素都可序(ordered),但未必有序(sorted),元素在顺序容器中的顺序与其加入容器时的位置相对应(遍历时可以根据位置顺序来访问?通过迭代器自增访问?)。
所谓关联式容器,即元素的位置由元素相关联的关键字值决定(关联式容器如何进行访问,通过迭代器的话,是类似序列容器的自增吗?)。

算法
各种常用算法的实现与封装,如,查找,排序,拷贝,删除等。从实现角度来看,STL算法是一种function template.
迭代器
迭代器,在设计模式中有一种模式叫迭代器模式,简单来说就是提供一种方法,在不需要暴露某个容器的内部表现形式情况下,使之能依次访问该容器中的各个元素,这种设计思维在STL中得到了广泛的应用,是STL的关键所在,通过迭代器,容器和算法可以有机的粘合在一起,只要对算法给予不同的迭代器,就可以对不同容器进行相同的算法操作,即只要容器提供迭代器的接口,同一套算法代码可以利用在完全不同的容器中。从实现角度看,迭代器是一种将*,->,++,--等指针相关操作予以重载的class template,比指针更丰富的功能。
容器的迭代器类型
每种容器类型都定义了自己的迭代器类型,如vector,vector<int> ::iterator iter;变量名为iter。迭代器并不是独立的数据类型,必须添加容器作用域后才能确定类型,vector的迭代器为指针,list的为类。
下面是从网上看到的一段代码,最开始没反应过来,实际问题为:it为vector<int>类型,而不是int类型,之所以对it取*可以访问元素,是对*进行了重载。
class A
{
public:
int* GetA(int b)
{
for(std::vector<int>::iterator it = _a.begin(); it != _a.end(); ++it)
{
if((*it) == b)
return &(*it); //这里如果直接返回迭代器it会报错 所有取内容然后取地址返回不会报错
}
return NULL;
} void SetA(int b)
{
_a.push_back(b);
}
private:
std::vector<int> _a;
};
迭代器的begin和end操作
int main()
{
vector <int> v{ ,,,,,, }; auto beg = v.begin();
auto end = v.end();
}
迭代器和指针不一样,容器有迭代器类型同时拥有返回迭代器的成员。比如,容器都有的成员begin和end,其中begin成员返回指向第一个元素的迭代器,而end成员返回指向容器尾元素的下一个位置的迭代器。end操作返回的迭代器并不指向vector中任何实际的元素,它只是起到一个哨兵的作用,表示我们已经处理完vector中的所有元素。
如果容器为空,则begin和end返回的是同一个迭代器,都是尾后迭代器。另外,我们不在意迭代器的类型,因此可以通过auto数据类型接收迭代器类型。
迭代器与指针
1)本质不同,迭代器是类模板,指针是存储数据地址的变量;
2)迭代器是广义上的指针,类似“智能指针”。事实上,它可以是指针,也可以是一个对其执行类似指针的操作的对象,如解除引用(如operator*())和递增(如operator++());
3)指针能指向函数而迭代器不行,迭代器只能指向容器;
4)原生指针也是一种迭代器(解释需要涉及STL源码解析),指针只能用于某些特定的容器;
5)迭代器使用时,通过begin和end成员返回迭代器,而指针通过取地址符获取空间地址。
注意:在用迭代器执行erase,insert等函数时,迭代器的指针会被释放掉,从而不能继续使用,如果继续使用,则会报错,适用于vector(可能还有其他??)。
原生、泛型、智能指针
1) 原生指针
就是最普通的指针,定义类似: 类型 *变量名;
与之对比的是使用上有类似指针的功能 实际并不是指针。比如:迭代器
[一个类重载 *和->操作符 那么可以像指针一样使用 但是这种并不是原生的]
2) 泛型指针
第一种就是 void *指针 可以指向任意的数据结构 因此可以称为"泛型"。
第二种就是指具有指针特性的泛型数据结构 如:泛型迭代器和接下来要说的智能指针。
3) 智能指针
C++中没有自动回收内存的机制,因此出现了智能指针。 一般我们将一个指针封装到一个智能指针类中,该类中有一个引用计数器。对指针的复制等操作会使引用计数+1,delete操作会使引用计数-1。计数=0时,指针=NULL。
迭代器遍历元素的注意事项
在for循环内遍历容器元素时,结束判断条件尽量不要使用<,尽量使用!=
void test001(){
vector<int>tmp;
for (int i = ; i < ; i++){
tmp.push_back(i);
}
for (vector<int>::iterator ite = tmp.begin();
ite < tmp.end(); ite++){
cout << *ite << endl;
}
//尽量采用下面的!=而不是<,因为所有的标准库容器中都定义了==和!=,他们中的大多数都没有定义<运算符
for (vector<int>::iterator ite = tmp.begin();
ite != tmp.end(); ite++){
*ite = ;
cout << *ite << endl;
}
}
关于内置数组array和STL中的array
初识STL的更多相关文章
- 初识STL vector
写这个主要是当作笔记来写的,配上自己的理解加上一些测试示例; 上代码: #include<iostream>#include<cstring>#include<vecto ...
- c++中STL库简介及使用说明
作为C++标准不可缺少的一部分,STL应该是渗透在C++程序的角角落落里的.STL不是实验室里的宠儿,也不是程序员桌上的摆设,她的激动人心并非昙花一现.本教程旨在传播和普及STL的基础知识,若能借此机 ...
- C++ STL轻松导学
作为C++标准不可缺少的一部分,STL应该是渗透在C++程序的角角落落里的.STL不是实验室里的宠儿,也不是程序员桌上的摆设,她的激动人心并非昙花一现.本教程旨在传播和普及STL的基础知识,若能借此机 ...
- C++ STL编程轻松入门基础
C++ STL编程轻松入门基础 1 初识STL:解答一些疑问 1.1 一个最关心的问题:什么是STL 1.2 追根溯源:STL的历史 1.3 千丝万缕的联系 1.4 STL的不同实现版本 2 牛刀小试 ...
- C++ STL编程轻松入门【转载】
1 初识STL:解答一些疑问 1.1 一个最关心的问题:什么是STL "什么是STL?",假如你对STL还知之甚少,那么我想,你一定很想知道这个问题的答案,坦率地讲,要指望用短短数 ...
- STL学习笔记(转,还是比较全的)
STL简介 1 概况 2 1.1 STL是什么 2 1.2 为什么我们需要学习STL 2 1.3 初识STL 2 1.4 STL 的组成 5 2 容器 6 2.1 基本容器——向量(vector) 6 ...
- c++ :STL
基础知识 容器 容器就是一些模板类的集合,不同之处就是容器中封装的是数据结构 1.序列容器 主要有vector向量容器.list列表容器.deque双端队列容器 元素在容器中是无序的 2.排序容器 包 ...
- C++ STL 概述_严丝合缝的合作者们
1. 初识 STL 什么是STL? STL(Standard Template Library) 是C++以模板形式提供的一套标准库,提供了很多开发过程需要的通用功能模块.使用 STL ,可以让开发者 ...
- C++ push方法与push_back方法
[转载他人的文章,下午在搞c++,谢谢共享] [摘要] push与push_back是STL中常见的方法,都是向数据结构中添加元素.初识STL,对于添加元素的方法以产生混淆,这里暂对两种方法作出比较分 ...
随机推荐
- C语言结构体数组
#include <stdio.h> int main() { /*************************************************** *结构体数组:数组 ...
- Linux/CentOS 7 timezone 修改
1.su - 登录root用户 2.timedatectl set-timezone {timezone} (set后面加想要设置的时区) 举例:timedatectl set-timezone As ...
- __stdcall,__cdecl,__fastcall,_stdcall,_cdecl,_fastcall 区别简介[转]
今天写线程函数时,发现msdn中对ThreadProc的定义有要求: DWORD WINAPI ThreadProc(LPVOID lpParameter); 不解为什么要用WINAPI宏定义,查 ...
- thinkphp session支持
系统提供了Session管理和操作的完善支持,全部操作可以通过一个内置的session函数完成,该函数可以完成Session的设置.获取.删除和管理操作. session初始化设置 如果session ...
- css清除浮动的几种方法
推荐几种好用的清除浮动方法: 方法1: .clearfix:after { content:"."; display:block; height:; clear:both; vis ...
- cnn知识点汇总
关于卷积神经网络的入门基础知识: https://blog.csdn.net/weixin_42451919/article/details/81381294 卷积神经网络的相关公式推导: htt ...
- NX二次开发-NXOPEN获取所有工程图和所有视图DrawingSheet,DrawingSheetCollection,DraftingView
NX11+VS2013 #include <NXOpen/Part.hxx> #include <NXOpen/PartCollection.hxx> #include < ...
- 利用NHibernate与MySQL数据库交互
本文章使用Visual Studio作为开发工具,并建立在已经安装MySQL数据库的前提. NHibernate是一个面向.NET环境的对象/关系数据库映射工具.官网:http://nhibernat ...
- 秦曾昌人工智能课程---7、决策树集成学习Tree Ensembles
秦曾昌人工智能课程---7.决策树集成学习Tree Ensembles 一.总结 一句话总结: 其实机器模型减少variance的比较好的方式就是 多个模型取平均值 1.CART是什么? classi ...
- 4.RabbitMQ Linux安装
这里使用的Linux是CentOS6.2 将/etc/yum.repo.d/目录下的所有repo文件删除 先下载epel源 # wget -O /etc/yum.repos.d/epel-erlan ...