STL是一种泛型编程(generic programming)

  • STL提供了一组表示容器、迭代器、函数对象和算法的模板。
  • 面向对象编程关注的是编程的数据方面,而泛型编程关注的是算法
  • 他们之间的共同点是抽象和创建可重用代码,但是他们的理念截然不同。

1、容器(container)

  • 容器类是一个与数组类似的单元,但是他是管理序列的类,也是容纳一组对象对象集的类。
  • 通过容器类提供的成员函数,可以实现例如向序列中插入、删除、查找元素等操作;
  • 这些成员函数通过返回迭代器来指定元素在序列中的位置。

容器主要有以下分类:

二、泛型算法(generic algorithm)

  • 模板中的算法不依赖与具体的数据类型,而泛型算法更进一步不依赖于具体的容器。
  • 这也是STL最大的优点,就是他提供能在各种容器中通用的算法,例如:插入、排序、查找、删除等。
  • 一种算法可以适用于多种容器,故称为泛型算法;
  • 泛型算法之所以能够用于各种容器,是因为有迭代器。

三、迭代器(iterator)

  • STL设计的精髓在于把容器和算法分开,彼此独立设计,最后再用迭代器把他们合并在一起。

  • 迭代器是一种数据类型,他提供了一种方法,可以顺序访问一个容器中的每个元素,而又不暴露该对象的内部表示

  • 迭代器的用法和指针类似,只不过它相当于一个智能指针,它指向容器内部的数据,并可以通过解引用*来获取它指向的数据。

  • STL提供的所有容器都有这样的迭代器,用以存取他们所管理的元素序列。

例如:

容器的成员函数begin()返回指向容器中第一个元素的迭代器;end()返回指向容器中最后一个元素后继位置的迭代器。

下面通过STL中提供的一个泛型函数find()来说明迭代器与泛型算法的关系:

首先看下STL对于find函数的内部实现:

template <class input_iterator_tag,class T>
input_iterator_tag find(input_iterator_tag first,input_iterator_tag last,const T value)
{for(;first != last;first++){if(value == *first)return first;}return last;
}

注意:

  • 源码中出现的input_iterator_tag是一个输入迭代器类,它的功能是从容器中读取元素。
  • 第一个参数和第二个参数给出了find函数要查找的范围,这个范围是一个左闭右开的区间:[first, last),last对应的元素不在查找范围内。
  • 这是一个普遍的约定,所有的泛型算法都遵守这个约定,在后面的程序中还会遇到的。

然后在应用程序中测试:

#include <iostream>
#include <algorithm>
using namespace std;
int main()
{int num[] = {1,2,3,4,5};int *result,value;cout << "please input the num you want to search:" ;cin>>value;result = find(num,num+5,value);    //注意这里模板参数被特化为int *if(result == num+5)cout<<"can't find the num you input\n\n";elsecout<<"find it!,the index is:"<<result-num<<endl;return 0;
}

运行结果:

结合find()函数的源码可以知道,泛型算法不直接访问容器的的元素,与容器无关。元素的全部访问和遍历都通过迭代器实现,并不需要知道容器的类型。

四、顺序容器之矢量类

  • 矢量vector类是一个多功能、能够操作多种数据结构和算法的模板类和函数库。
  • 它和数组类似,通过下标运算符访问矢量中的元素,并且其元素具有连续的内存地址
  • vector类的一大优点是,他可以进行动态的内存管理。并且该类内部包含很多常用的函数、特有函数,用以实现堆栈、队列、列表等结构。

每种容器都有自己支持的迭代器类型,迭代器决定了可采用哪种算法。vector支持随机访问迭代器,能直接访问容器中的任意元素,功能比较强大。选择所需容器类实际上很大部分是选择所支持的迭代器。

下面通过一个简单的demo演示vector类的应用:

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main()
{double values[] = {1,2,3,4,5,6,7};int i;//构造一个向量vector<double> dVector(values,values+7);cout<<"1.init value is:";for(i=0;i<dVector.size();i++)cout<<dVector[i]<<"\t";cout<<endl;dVector.assign(4,1.5);  //将1.5复制4份cout<<"2.after assign,the value is:";for(i=0;i<dVector.size();i++)cout<<dVector[i]<<"\t";cout<<endl;dVector.at(0) = 34.3;   //给向量中的第一个元素赋值cout<<"3.after the at,the value is::";for(i=0;i<dVector.size();i++)cout<<dVector[i]<<"\t";cout<<endl;//将首元素的迭代器赋值给itrvector<double>::iterator itr = dVector.begin();dVector.insert(itr+1,55);dVector.insert(itr+1,66);dVector.insert(dVector.begin()+1,0);    //这个用法和上面的用法一样cout<<"4.:after insert,the value is:";for(i=0;i<dVector.size();i++)cout<<dVector[i]<<"\t";cout<<endl;return 0;
}

运行结果:

更多vector类的成员函数可以访问: http://www.cplusplus.com/reference/vector/vector/?kw=vector

c++(标准模板库STL)相关推荐

  1. C++ 标准模板库(STL)

    C++ 标准模板库(STL) C++ STL (Standard Template Library标准模板库) 是通用类模板和算法的集合,它提供给程序员一些标准的数据结构的实现如 queues(队列) ...

  2. c++标准模板库STL【快速查找】【最全】【常用】【语法】

    c++标准模板库STL[快速查找][最全][常用][语法] c标准模板库STL快速查找最全常用语法         vector- 变长数组         set-内部自动有序且不含重复元素     ...

  3. c语言stl模板,c/c++开发分享C++ 标准模板库 STL 顺序容器详解

    c++ 标准模板库 stl 顺序容器 容器 顺序性 重复性 支持迭代器 vector 动态数组 无序 可重复 随机访问迭代器 deque 双向队列 无序 可重复 随机访问迭代器 list 双向链表 无 ...

  4. 13 标准模板库STL【C++】

    13 标准模板库STL 13- 判断题 单选题 填空题 程序填空题 函数题 7-1 .查找电话号码 7-2 姓名排序 7-3 Score Processing 13+ 编程题 7-1 查找成绩并折算后 ...

  5. 第十章 标准模板库STL

    第十章 标准模板库STL 因为是在复习时重写的,无法在PTA上验证,编程题格式可能有误. 判断题 1.可以通过下标随机访问向量vector中的元素.(T) 2.当向量对象的内存用完之后,就会产生越界错 ...

  6. 标准模板库STL(Standard Template Library)

    标准模板库STL(Standard Template Library)指南 /*刘振飞liuzf@pku.org.cn 1999-10-20*/ / *版权所有 (C) 1999-2004 刘振飞li ...

  7. C++中标准模板库STL基本概念

    0. 前言 C++语言的一大优势就是便于软件的重用,而重用体现在两方面: 1. 面向对象思想:继承和多态,标准类库 2. 泛程序设计(Generic Programming)思想:模板机制,标准模板库 ...

  8. 蓝桥杯算法竞赛系列第0章——蓝桥必考点及标准模板库STL(上)(万字博文,建议抱走)

    欢迎来到:遇见蓝桥遇见你,不负代码不负卿! 目录 ​ 一.蓝桥必考点剖析 二.什么是STL 三.vector的常见用法详解 1.vector的定义 2.vector容器内元素的访问 (1).通过下标访 ...

  9. C++ ——模板 标准模板库STL

    C++ 知识基础 流操作符 类 & 基础 初始化和重载 类 & 高级 继承和多态 模板 & 标准模板库STL 目录 C++ 一.模板 1.函数模板 2.类模板 二.标准模板库S ...

  10. C++ 标准模板库 STL 概述

    泛型程序设计 C++ 的特点: ​ C++ 的核心优势之一就是便于软件重用,而软件的重用在 C++ 中主要体现在以下两个方面: 面向对象的思想:继承.多态和标准类库 泛型程序设计的思想:模板机制和标准 ...

最新文章

  1. FGMap学习之--加载百度地图
  2. JavaScript比较中应使用哪个等于运算符(== vs ===)?
  3. Matlab回显语句
  4. 【分析】1021 Deepest Root (25 分)【DFS解法】
  5. One Order CLOSING date修改后的执行原理
  6. 计算机网络技术放块队解说词,基于《计算机网络技术》课程多媒体课件制作与设计.doc...
  7. oracle 数据库启动停止小结
  8. Android代码 listview选中,Android开发listview选中高亮简单实现代码分享
  9. 逆发动机模型map图制作
  10. 百词斩不复习_百词斩怎么复习,学好英语的前提条件是?
  11. 电子邮件营销是什么?邮件群发软件
  12. Angular /Angular cli安装教程
  13. ZEMAX知识点:景深概念及计算公式推导
  14. 计算机cpu和显卡的搭配要求,CPU和显卡怎么搭配好 显卡和CPU搭配有什么要求吗...
  15. android saf小结
  16. Pro-Level Photography for Graphic Designers 平面设计师专业摄影教程 Lynda课程中文字幕
  17. Activiti 自定义流程图颜色
  18. java方法怎么声明_【Java方法的声明和使用】
  19. 品茗股份承办第四届中国BIM(数字建造)经理高峰论坛在杭召开
  20. 最优化基础理论和知识——1.21.3一部分

热门文章

  1. 六. 先有鸡还是先有蛋?--SLAM
  2. 基本数学逻辑学符号(数学知识用程序表达轻松学系列)
  3. 这12张数据治理内涵图,你看懂了吗
  4. mysql空洞,mysql crud造成数据空洞的原因
  5. linux文件空洞与稀疏文件,Linux文件空洞与稀疏文件
  6. 利率里面的BP是什么意思,bp是什么意思贷款利率
  7. 961 计算机学科专业基础综合,2018年北京航空航天大学961计算机学科专业基础综合考研复习资料...
  8. 完美世界CEO萧泓:年轻化战略大有可为
  9. 【Hadoop】Hadoop Snappy 安装 (Ubuntu 16.04)
  10. 宝塔同时安装苹果cms海洋cms_海洋cms新手入门安装配置教程