c++的STL--1概念通述

STL的概念

什么是STL?
STL(standard template libaray-标准模板库):是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且 是一个包罗数据结构与算法的软件框架。

  1. STL从广义上分为:容器(container),算法(algorithm),迭代器(iterator),容器和算法之间通过迭代器进行无缝连接。STL几乎所有的代码都采用了模板类或者模板函数,这相比传统的由函数和类组成的库来说提供了更好的代码重用机会。STL(Standard Template Library)标准模板库,在我们c++标准库中隶属于STL的占到了80%。

STL六大组件简介

STL提供了六组件,彼此之间可以组合套用,这六大组件分别是:容器,算法,迭代器。仿函数,适配器(配接器),空间配置器。

  1. 容器:各种数据结构,如vector,list,deque,set,map等,用来存访数据,从实现角度来看,STL容器是一种class template
  2. 算法:各种常用的算法,如sort,find,copy,for_each.从实现的角度看,STL的算法是一种function tempalte
  3. 迭代器:扮演了容器与算法之间的胶合剂,共有五种类型,从实现角度来看,迭代器是一种operator*,operator->,operator++,operator–等指针相关操作予以重载的class template。所有STL容器都附带有自己专属的迭代器,只有容器的设计者才知道如何遍历自己的元素。原生指针也是一种迭代器。
  4. 仿函数:行为类似函数,可作为算哒的某种策略。从实现角度来看,仿函数是一种重载了operator()的class或者class template
  5. 适配器:一种用来修饰容器或者仿函数或迭代器接口的东西
  6. 空间配置器:负责空间的配置与管理。从实现角度看,配置器是一个实现了动态空间配置,空间管理,空间释放的class template

STL六大组件的交互关系,容器通过空间配置器取得数据存储空间,算法通过迭代器存储容器中得内容,仿函数可以协助算法完成不同的策略的变化,适配器可以修饰仿函数。

STL的优点

  1. STL是c++的一部分,因此不用额外安装什么,它被内建在你的编译器之内。
  2. STL的一个重要特征是将数据和操作分离。数据由容器类别加以管理,操作则由可定制的算法定义。迭代器在两者之间充当“粘合剂”,以使算法可以和容器交互运作
  3. 程序员可以不用思考STL具体的实现过程,只要能够熟练使用STL就OK了。这样他们就可以把精力放在程序开放的别的方面
  4. STL具有高可重用性,高性能,高移植性,跨平台的优点

高可重用性 STL中几乎所有的代码都采用了模板类和模板函数的方式实现,这相比传统的由函数和类组成的库来说提供了更好的代码重用机会。
高性能:如map可以高效地从十万条记录里面查找指定的记录,因为map是采用红黑树的变体实现的
高移植性性:如在项目A上用STL编写的模块,可以直接移植到项目B上

三大组件

容器:
常用的数据结构:数组(array),链表(list),tree(树),栈(stac)队列(queue),集合(set),映射表(map),根据数据在容器中的排列特性,这些数据分为序列式容器关联式容器两种

  1. 序列式容器强调值得排序,序列式容器中得每个元素均有固定得位置,除非用删除或插入得操作改变这个位置。Vector容器,Deque容器,List容器等。
  2. 关联式容器是非线性得数结构,更准确得说是二叉树结构,各元素之间没有严格的物理上得顺序关系,也就是说元素在容器中并没有保存元素置入容器时的逻辑顺序,关联式容器另一个显著特点是:在值中选择一个值作为关键字key,这个关键字对值起到索引的作用,方便查找。Set/multiset容器-Map/mulitimap容器

算法:
广义而言,我们所编写的每个程序都是一个算法,其中的每个函数也是一个算法,毕竟它们都是用来解决或大或小的逻辑问题或数学问题。STL收录的算法经过了数学上的效能分析与证明,是极具复用价值的,包括常用的排序,查找等等。特定的算法往往搭配特定的数据结构,算法与数据结构相辅相成。
3. 算法分为:质变算法非质变算法
4. 质变算法:是指运算过程中会更改区间内的元素的内容。例如拷贝,替换,删除等等
5. 非质变算法:是指运算过程中不会更改区间内的元素内容,例如查找,计数,遍历,寻找极值

再好的编程,也无法让一个笨拙的算法起死回生。

迭代器

依次寻访某个容器所含的各个元素
在这里插入图片描述

#include<iostream>
#include<string>
using namespace std;
#include<vector>
//使用系统算法的头文件
#include<algorithm>//容器 vector//迭代器 遍历功能 用指针理解
//普通的指针也算一种指针
void test01()
{int array[5] = { 1, 3, 5, 7, 8 };int * p = array;//指针指向数组首地址 &array[0]for (int i = 0; i < 5; i++){//cout << array[i] << endl;cout << *(p++) << endl;}}void myPrint(int v)
{cout << v << endl;
}void test02()
{//声明容器vector<int>v;//声明一个容器 这个容器中存放int类型数据 对象名称//向容器中加入数据v.push_back(10);v.push_back(20);v.push_back(30);v.push_back(40);//遍历容器中的数据//利用迭代器vector<int >::iterator itBegin = v.begin();//itBegin指向是v容器的起始位置vector<int >::iterator itEnd = v.end();//itEnd指向容器中最后一个位置的下一个地址/*while (itBegin!=itEnd){cout << *itBegin << endl;itBegin++;}*///第二种遍历方式//for (int i = 0; i < 10; i++)/*for (vector<int>::iterator it = v.begin(); it != v.end();it++){cout << *it << endl;}*///第三种方式  利用算法for_each(v.begin(), v.end(), myPrint);}//操作自定义 的数据类型
class Person
{
public:Person(string name,int age){this->m_Name = name;this->m_Age = age;}string m_Name;int m_Age;
};void  test03()
{vector<Person >v;Person p1("大头儿子",10);Person p2("小头爸爸", 30);Person p3("隔壁王叔叔", 30);Person p4("围裙妈妈", 28);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).m_Name << "年龄:" << it->m_Age << endl;}}//存放自定义数据类型的指针
void test04()
{vector<Person *>v;Person p1("大头儿子", 10);Person p2("小头爸爸", 30);Person p3("隔壁王叔叔", 30);Person p4("围裙妈妈", 28);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)->m_Name << "年龄:" << (*it)->m_Age << endl;}
}//容器嵌套容器
void test05()
{vector<vector<int>>v;vector<int>v1;vector<int >v2;vector<int >v3;for (int i = 0; i < 5; i++){v1.push_back(i);v2.push_back(i + 100);v3.push_back(i + 100);}//将小容器放入到大容器中v.push_back(v1);v.push_back(v2);v.push_back(v3);//遍历所有数据for (vector<vector<int>>::iterator it = v.begin(); it != v.end(); it++){for (vector<int>::iterator vit = (*it).begin(); vit != (*it).end(); vit++){cout << *vit << " ";}cout << endl;}
}int main()
{//test01();//test02();//test03();//test04();test05();system("pause");return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/383280.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c++的vector容器

vector容器概念 vector是表示可变大小数组的序列容器。就像数组一样&#xff0c;vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素 进行访问&#xff0c;和数组一样高效。但是又不像数组&#xff0c;它的大小是可以动态改变的&#xff0c;而且它…

新一代数据库技术

新一代非关系型数据库有以下5个主要类型&#xff1a; 面向文件存储&#xff1a;适用于存储海量文件&#xff0c;代表产品MongoDb 列存储(wide column store/column-family)数据库&#xff1a;快速查找相关数据&#xff0c;相关数据被放在同一列中&#xff0c;代表产品Cassandra…

c++中stack容器

Stack 简介 stack 是堆栈容器&#xff0c;是一种“先进后出”的容器。stack 是简单地装饰 deque 容器而成为另外的一种容器。#include stack没有迭代器 Stack所有元素的进出都必须符合“先进后出”的条件&#xff0c;只有stack顶端的元素&#xff0c;才有机会被外界取用&am…

c++中的queue容器

queue容器 队列是一种容器适配器&#xff0c;专门用于在FIFO上下文(先进先出)中操作&#xff0c;其中从容器一端插入元素&#xff0c;另一端 提取元素。 队列作为容器适配器实现&#xff0c;容器适配器即将特定容器类封装作为其底层容器类&#xff0c;queue提供一组特定的 成员…

c++中list容器

list概念 list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。list的底层是双向链表结构&#xff0c;双向链表中每个元素存储在互不相关的独立节点中&#xff0c;在节点中通过指针指向 其前一个元素和后一个元素。list与for…

c++中容器(STL)的共性与使用的时机

容器的共通能力 C模板是容器的概念 理论提高&#xff1a;所有容器提供的都是值&#xff08;value&#xff09;语意&#xff0c;而非引用&#xff08;reference&#xff09;语意。容器执 行插入元素的操作时&#xff0c;内部实施拷贝动作。所以 STL 容器内存储的元素必须能够被…

Qt Creator 窗体控件自适应窗口大小布局

常见的软件窗口大小改变&#xff08;最大化、手动改变时&#xff09;需要窗口的部件能够自适应布局&#xff0c;而在Qt的应用程序界面设计中&#xff0c;对于像我一样的初学者如何实现窗口自适应调整还是要绕点弯路的。网上百度了很多&#xff0c;多数说的很含糊&#xff0c;还…

QT子线程与主线程的信号槽通信

最近用QT做一个服务器&#xff0c;众所周知&#xff0c;QT的主线程必须保持畅通&#xff0c;才能刷新UI。所以&#xff0c;网络通信端采用新开线程的方式。在涉及到使用子线程更新Ui上的控件时遇到了点儿麻烦。网上提供了很多同一线程不同类间采用信号槽通信的方式&#xff0c;…

c++中的函数适配器

函数适配器 函数适配器概念 STL中定义了大量的函数对象&#xff0c;但是有时候需要对函数返回值进行进一步的简单计算&#xff0c;或者填上多余的参数&#xff0c;不能直接代入算法&#xff0c;函数适配器实现了这一功能&#xff0c;将一种函数对象转化为另一种符合要求的函数…

c++中STL实现演讲比赛流程

演讲比赛流程 1&#xff09;某市举行一场演讲比赛&#xff0c;共有 24 个人参加&#xff0c;按参加顺序设置参赛号。比赛共三轮&#xff0c;前两 轮为淘汰赛&#xff0c;第三轮为决赛。 2&#xff09;比赛方式&#xff1a;分组比赛 第一轮分为 4 个小组&#xff0c;根据参赛号…

c++实现贪吃蛇

游戏中的实现元素 游戏中元素分为&#xff1a;墙壁&#xff0c;蛇&#xff0c;事物以及蛇的可行区域和右侧的版本号和游戏玩法提示 墙壁 *号表示&#xff0c;代表一个区域范围&#xff0c;也就是蛇的可移动区域&#xff0c;蛇如果碰到墙壁视为死亡&#xff0c; 蛇 分为蛇头&a…

Linux系统编程--1(进程和程序,CPU和MMU,PCB,进程状态)

进程相关概念 程序和进程 程序&#xff1a;是指编译好的二进制文件&#xff0c;在磁盘上&#xff0c;不占用系统资源(cpu、内存、打开的文件、设备、锁…) 进程&#xff1a;是一个抽象的概念&#xff0c;与操作系统原理联系紧密。进程是活跃的程序&#xff08;程序员角度&…

Linux系统编程--2(环境变量,进程控制)

环境变量 环境变量 是指在操作系统中用来指定操作系统运行环境的一些参数 每个人用电脑的习惯不一样&#xff0c;比如一般把文件放到磁盘&#xff0c;怎么管理文件&#xff0c;用什么编译器&#xff0c;所以&#xff0c;环境变量就是根据每个人使用操作系统的习惯来规定一些参…

套接字编程--1(UDP协议编程,端口号,传输层协议,网络字节序)

传输层的协议&#xff1a; ip地址&#xff1a; 在网络中唯一标识一台主机 IPV4&#xff1a;uint32_t DHCP NATIPV6 : uint8_t addr[16] —向前并不兼容IPV4 每一条数据都必须包含源地址和目的地址&#xff1a;因为每条网络中的数据都必须确定是从那个主机来到那个主机去 端…

Linux系统编程--3(exec 函数族,僵尸进程和孤儿进程,wait和wait_pid回收子进程)

exec 函数族 fork 创建子进程后执行的是和父进程相同的程序&#xff08;但有可能执行不同的代码分支&#xff09; &#xff0c;子进程往往要调用一种 exec 函数以执行另一个程序。当进程调用一种 exec 函数时&#xff0c;该进程的用户空间代码和数据完全被新程序替换&#xff…

交换机MAC地址学习和转发数据帧的原理

1 &#xff1a;交换机 MAC 地址学习在交换机初始化的&#xff0c;也就是刚启动的时候&#xff0c;交换机的MAC地址表是没有任何MAC地址和端口的映射条目的 当PCA要想和PCC&#xff0c;PCB,PCD进行通信时&#xff0c;当该二层数据帧通过端口E1/0/1发送到交换机上时&#xff0c…

Linux系统编程---4(进程间通信IPC,管道)

进程间通信目的 数据传输&#xff1a;一个进程需要将它的数据发送给另一个进程资源共享&#xff1a;多个进程之间共享同样的资源。通知事件&#xff1a;一个进程需要向另一个或一组进程发送消息&#xff0c;通知它&#xff08;它们&#xff09;发生了某种事件&#xff08;如进…

冲突域 广播域简单解释

网络互连设备可以将网络划分为不同的冲突域、广播域。但是&#xff0c;由于不同的网络互连设备可能工作在OSI模型的不同层次上。因此&#xff0c;它们划分冲突域、广播域的效果也就各不相同。如中继器工作在物理层&#xff0c;网桥和交换机工作在数据链路层&#xff0c;路由器工…

Linux系统编程---5(共享存储映射,存储映射I/O,mmap函数,父子进程间通信,匿名映射)

共享存储映射 文件进程间通信 使用文件也可以完成 IPC&#xff0c;理论依据是&#xff0c;fork 后&#xff0c;父子进程共享文件描述符。也就共享打开的文件。 编程&#xff1a;父子进程共享打开的文件。借助文件进行进程间通信。 测试代码 /*** 父子进程共享打开的文件描述…