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,一经查实,立即删除!

相关文章

socket通信和异常处理札记

Linux socket通信出现CLOSE_WAIT状态的原因与解决方法 这个问题之前没有怎么留意过&#xff0c;是最近在面试过程中遇到的一个问题&#xff0c;面了两家公司&#xff0c;两家公司竟然都面到到了这个问题&#xff0c;不得不使我开始关注这个问题。说起CLOSE_WAIT状态&#xff0c…

mac 下使用wireshark监听网络上的数据

分三个步骤&#xff1a; 1.wireshark安装 wireshark运行需要mac上安装X11&#xff0c;mac 10.8的系统上默认是没有X11的。先去http://xquartz.macosforge.org/landing/下载最新的 xquartz安装&#xff0c;安装好就有X11了。 wireshark的下载&#xff0c;网…

c++的vector容器

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

嵌入式Linux下3G USB Modem的使用

busybox中需打开&#xff1a;wc&#xff0c;pidof&#xff1b; busybox中shell下打开getopts 百度搜索“Serial connection established. using channel 1”包含大量问题解答 2013-12-22 0个评论 收藏 我要投稿 一.ARM-Linux ARM-Linux-2.6.17 3G USB Modem:hu…

新一代数据库技术

新一代非关系型数据库有以下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…

详解udev

如果你使用Linux比较长时间了&#xff0c;那你就知道&#xff0c;在对待设备文件这块&#xff0c;Linux改变了几次策略。在Linux早期&#xff0c;设备文件仅仅是是一些带有适当的属性集的普通文件&#xff0c;它由mknod命令创建&#xff0c;文件存放在/dev目录下。后来&#xf…

c++中的queue容器

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

NAU8810相关问题

1.ADC和DAC有什么区别&#xff1f; 不&#xff0c;这不是一个“愚弄人的”问题或脑筋急转弯&#xff0c;并且我认为我们的读者都非常清楚模数转换器(ADC)及数模转换器(DAC)的基本功能。 但在如何使用这些转换器以及人们的认知度上也存在着哲理性区别。用最简单的话讲&#xff0…

c++中list容器

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

Linux中rc的含义

在Linux中&#xff0c;最为常用的缩略语也许是“rc”&#xff0c;它是“runcomm”的缩写――即名词“run command”(运行命令)的简写。rc”是任何脚本类文件的后缀&#xff0c;这些脚本通常在程序的启动阶段被调用&#xff0c;通常是Linux系统启动时。如/etc/rc&#xff08;连接…

c++中的set容器和multiset容器

set容器基本概念 set的特性是&#xff0c;所有元素都会根据元素的键值自动被排序。set的元素不像map那样可以同时拥有实值和键值&#xff0c;set的元素即是键值又是实值。set不允许两个元素又相同的键值。我们不可以通过set的迭代器改变set元素的值&#xff0c;因为set元素值就…

linux下的僵尸进程处理SIGCHLD信号

什么是僵尸进程&#xff1f; 首先内核会释放终止进程(调用了exit系统调用)所使用的所有存储区&#xff0c;关闭所有打开的文件等&#xff0c;但内核为每一个终止子进程保存了一定量的信息。这些信息至少包括进程ID&#xff0c;进程的终止状态&#xff0c;以及该进程使用的CPU时…

c++中的map容器

map/multimap基本概念 Map的特性是&#xff0c;所有元素都会根据元素的键值自动排序。Map所有的元素都是pair&#xff0c;同时拥有实值和键值&#xff0c;pair的第一元素被视为键值&#xff0c;第二元素被视为实值&#xff0c;map不允许两个元素有相同的键值我们可以通过map的…

mknod指令详解

mknod - make block or character special files mknod [OPTION]... NAME TYPE [MAJOR MINOR] option 有用的就是 -m 了 name 自定义 type 有 b 和 c 还有 p 主设备号 次设备号 主设备号是由linux/major.h定义的&#xff0c;如下定义了一个DOC设备&am…

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

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

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

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

c++中利用STL实现公司员工分组问题

#include<iostream>using namespace std; #include<vector> #include<string> #include<map> #include<ctime> /* 公司招聘了5个员工&#xff0c;5名员工进入公司之后&#xff0c;需要指派员工在那个部门工作 的人员信息&#xff1a;姓名 年龄 电…

c++中STL的常用算法--1(函数对象,谓词,内建函数对象)

函数对象 重载函数调用操作符的类&#xff0c;其对象常称为函数对象&#xff08;function object&#xff09;&#xff0c;即它们是行为类似函数的对象&#xff0c;也叫仿函数&#xff08;functor&#xff09;&#xff0c;其实就是重载"()"操作符&#xff0c;使得类…

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

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