STL的学习之一

1)STL扫盲

1)C++标准库和标准模板库是不一样的
2)标准模板库是用泛型编程方式编写的函数或者类库;
3)  SGI STL linux一般用,P.J.Plauger STL,visual2017 windows用
STL六大组件 :
容器,迭代器
STL 算法(说白了就是函数!);
STL 分配器:(分配内存的,也叫内存分配器)allocator [ˈæləˌkeɪtə]
适配器和仿函数
convert 转换,converge 汇聚,收敛
容器分类:顺序容器,关联容器(associate [əˈsəʊsɪˌcontainer),无序容器;注意:associate的第一个as是ad变体,表示靠近的意思
deque 双端队列:double end queue
foward_list是单向链表

2)stl::array中,存储的字符串时,内存关系案例:

#include<iostream>
#include<array>using namespace std;int main()
{array<string, 5> arr{ "1232222222222222222","456","aaaaaaa"};cout << sizeof(string) << endl; //28个字节for (int i = 0; i < arr.size(); ++i){const char* p = arr[i].c_str();cout << "---------------------begin-----------------" << endl;cout << "数组元素值= " << p << endl;printf("对象地址= %p\n", &arr[i]);printf("指向字符串地址= %p\n", p);cout << "---------------------end-----------------" << endl;cout << endl;}const char* p1 = "1232222222222222222";const char* p2 = "1232222222222222222";printf("p1地址= %p\n", p1);printf("p2地址= %p\n", p2);return 0;
}

//输出结果
28
---------------------begin-----------------
数组元素值= 1232222222222222222
对象地址= 012FFA74
指向字符串地址= 016BD988
---------------------end-----------------

---------------------begin-----------------
数组元素值= 456
对象地址= 012FFA90
指向字符串地址= 012FFA94
---------------------end-----------------

---------------------begin-----------------
数组元素值= aaaaaaa
对象地址= 012FFAAC
指向字符串地址= 012FFAB0
---------------------end-----------------

---------------------begin-----------------
数组元素值=
对象地址= 012FFAC8
指向字符串地址= 012FFACC
---------------------end-----------------

---------------------begin-----------------
数组元素值=
对象地址= 012FFAE4
指向字符串地址= 012FFAE8
---------------------end-----------------

p1地址= 0094DC74
p2地址= 0094DC74

//从以上结果可知:1)字符串string字节大小为28,2)array中的string数组地址相差28个字节,但指向的字符串地址是不挨着的。
//3 定义两个字符串常量,但其存储的字符串地址其实只有一个地址!!!
3)vector的构造拷贝学习

#include<array>
#include<vector>
#include<iostream>
using namespace std;class A
{
public:A(int a) :m_(a) { cout << "A constructor" << endl; }A(const A& obj):m_(obj.m_){ cout << "A copy constructor" << endl; }~A(){ cout << "A deconstructor" << endl; }
private:int m_;
};int main()
{vector<A> vec;//vec.reserve(10); 根据实际情况,调用这个函数,设置存储空间大小,就可以减少不必要的拷贝和析构;for (int i = 0; i < 5; i++){cout << "---------------------begin-----------------" << endl;vec.push_back(A(i));cout << "---------------------end-----------------" << endl;}return 0;
}

---------------------begin-----------------
A constructor
A copy constructor
A deconstructor
---------------------end-----------------
---------------------begin-----------------
A constructor
A copy constructor
A copy constructor
A deconstructor
A deconstructor
---------------------end-----------------
---------------------begin-----------------
A constructor
A copy constructor
A copy constructor
A copy constructor
A deconstructor
A deconstructor
A deconstructor
---------------------end-----------------
---------------------begin-----------------
A constructor
A copy constructor
A copy constructor
A copy constructor
A copy constructor
A deconstructor
A deconstructor
A deconstructor
A deconstructor
---------------------end-----------------
---------------------begin-----------------
A constructor
A copy constructor
A copy constructor
A copy constructor
A copy constructor
A copy constructor
A deconstructor
A deconstructor
A deconstructor
A deconstructor
A deconstructor
---------------------end-----------------
A deconstructor
A deconstructor
A deconstructor
A deconstructor
A deconstructor
说明:
//造成以上的问题的主要原因是,vector存储是连续的,当存储数据的时候,要不断调整存储空间大小,所以就会不断的拷贝和析构;
//解决上面的一个方法是,最开始就应该预留一个空间,调用reserve函数,这样就可以减少不必要的拷贝和析构;
4)分配器的使用案例

#include<iostream>
#include<list>using namespace std;int main()
{std::list<int> list;list.push_back(10);list.push_back(20);list.push_back(30);list.push_back(40);for (auto it = list.begin(); it != list.end(); it++){int* ptr = &(*it);printf("element address is: %p\r\n", ptr);}return 0;
}
//输出结果是(输出地址根本不联系!!!):
element address is: 011DFEC0
element address is: 011E0240
element address is: 011E0278
element address is: 011E0010
结论:上述代码中,缺省的分配器根本没有用内存池技术,应该采用的是malloc这个技术!//使用分配器的方法:
using namespace std;
//不建议直接使用
int main()
{std::allocator<int> allo;int* ptr = allo.allocate(3);*ptr = 1; ptr++;*ptr = 2; ptr++;*ptr = 3;allo.deallocate(ptr,3);return 0;
}

5)迭代器的使用

迭代器是一个对象(确切的说,类似于一个指针的对象);
迭代器和容器是紧密相关的。
迭代器是分类标准:迭代器的移动特性和数据访问操作;
输出迭代器,输入迭代器,前向迭代器,双向迭代器,随机访问迭代器
output_iterator_tag 
iterator、const_iterator、reverse_interator、const_reverse_interator有些模板类不提供迭代器,比如stack,deque,queue等;
typename修饰模板类型
typename iterator_traits<T>::iterator_category cagy; //"iterator_traits<T>::iterator_category"是一个类型,typename是说明类型的
#include<iostream>
#include<vector>using namespace std;template<typename T>
void printMsg(const T& tmp)
{if (tmp.size() >= 2){typename T::const_iterator iter(tmp.begin()); //错误提示:“const_iterator” : 类型 从属名称的使用必须以“typename”为前缀,所以必须添加为typenameint val = *iter;cout << val << endl;}
}int main()
{std::vector<int> v{ 1,2,3,4 };printMsg(v);return 0;
}

6)STL算法概述
算法就理解为函数,更确切的说是函数模板(全局函数/全局函数模板)
算法的前两个参数,大多数是一个迭代器区间!
前闭后开的好处:算法只要判断迭代器等于后边开区间,则表示迭代器结束;
如果iterator_begin==iterator_end则代表为空区间;
算法是搭配迭代器的使用的全局函数。算法跟容器没有毛关系,只跟迭代器有关。

for_each(begin,end,可调用对象);
仿写for_each遍历算法代码如下:
void printMsg(int i)
{cout << i << endl;
}
template<typename inputIterator,typename Fun>
void fun(inputIterator first, inputIterator end, Fun f)
{for (; first != end; first++){f(*first);}
}
int main()
{std::vector<int> vec{ 1,2,3,4,5 };fun(vec.begin(), vec.end(), printMsg);return 0;
}

6.1)sort的使用方法:

sort中的仿函数调用对象
class A
{
public:bool operator()(int i,int y){if (i > y)return true;else return false;}
};int main()
{std::vector<int> vec{ 1,20,13,54,51 };A a;sort(vec.begin(), vec.end(),a);for (auto it = vec.begin(); it != vec.end(); it++){cout << *it << endl;}return 0;
}adjacent:[əˈdʒeɪsnt]  临近的; 饿滴   家
ad是强调的作用,jac是ject的变体 记忆方法 ad  ja     cent  (我的家距离我近,回家可以吃饭)                                                                                                                                                                                                                                                                                            

7)函数对象的学习

函数对象也叫仿函数,是一个意思
在stl中,函数对象一般都合算法配合使用,实现一些特定功能,主要服务于算法!!!
标准模板库也给我们提供了一些函数对象,头文件包含<functional>,大概有十八个样子;
plus<int>(); //对这句话的解释:plus是类模板,加上"<int>"才可以成为真正的类plus<int>,再加上"()",生成一个临时对象,就是个可调用对象;
使用方法如下:
std::vector<int> vec{ 1,20,13,54,51 };
sort(vec.begin(), vec.end(), greater<int>());
for (auto it = vec.begin(); it != vec.end(); it++)
{cout << *it << endl;
}

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

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

相关文章

DataX DorisWriter 插件DorisStreamLoadObserver类详细解读

DorisStreamLoadObserver 类是一个用于将数据加载到 Doris&#xff08;以前称为 Palo&#xff09;数据库中并监视加载过程的 Java 类。该类提供了一组方法&#xff0c;用于构建 HTTP 请求、处理 HTTP 响应以及监控数据加载的状态。以下是每个方法的具体作用&#xff1a; Doris…

如何使用CSS实现一个自适应等高布局?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 使用 Flexbox 布局⭐ 使用 Grid 布局⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这个专栏是为那些对Web开发…

基于OpenCV+Keras+tensorflow 实现的变电站作业管控平台源代码。含人脸识别考勤,移动目标跟踪,越线检测,安全措施检测,姿态识别等功能

#综述 使用该作业现场安全生产智能管控平台来实现变电站的安全生产的智能化管理&#xff0c;通过人脸识别功能进行人员的考勤&#xff1b; 通过人员、车辆的检测和识别来实现变电站的智能化管理&#xff1b;通过安全行为识别和安全区域报警功能来实现对变电站内人员和设备安全的…

python使用字典暴力解析wifi密码

前言 最近无wifi可用,搜到了很多高质量但是没有密码的WiFi,我在想应该可以用python调用常见的wifi字典包来暴力破解一下这些WiFi,也许可以成功 原理 使用pip install pywifi命令安装pywifi 使用它调用本机网卡,设置wifi加密方式,对字典包扫描密码逐个尝试 扫描失败的密码会被…

【若依框架RuoYi-Vue-Plus 图片回显不显示问题,OSS文件上传或者本地上传】

一、问题 1.设计表 product&#xff08;商品表&#xff09; 有 id &#xff08;id&#xff09; name&#xff08;商品名&#xff09;icon&#xff08;图标&#xff09; 2.使用若依代码生成功能&#xff0c;导入product表&#xff0c;代码生成。 3.将生成的代码导入到项目中得到…

专访张少光---国内著名牛散、实战专家

导读&#xff1a;新财富最佳分析师评选作为中国本土第一份市场化的分析师评选&#xff0c;自2003年开启至今已20年&#xff0c;通过公正、公平、公开的评选&#xff0c;与市场各方共同挖掘了大量优秀分析师。值此新财富最佳分析师评选20周年之际&#xff0c;我们期望通过《对话…

51单片机智能电风扇控制系统proteus仿真设计( 仿真+程序+原理图+报告+讲解视频)

51单片机智能电风扇控制系统仿真设计( proteus仿真程序原理图报告讲解视频&#xff09; 讲解视频1.主要功能&#xff1a;2.仿真3. 原理图4. 程序代码5.设计报告6. 设计资料内容清单 51单片机智能电风扇控制系统仿真设计( proteus仿真程序原理图报告讲解视频&#xff09; 仿真图…

API管理风险:如何确保您的API安全与可靠?

API管理风险&#xff1a;如何确保您的API安全与可靠&#xff1f; 随着数字化时代的到来&#xff0c;应用程序接口&#xff08;API&#xff09;在现代软件开发中发挥着关键的作用。然而&#xff0c;API管理过程中存在着各种潜在的风险。本文将探讨如何有效地管理和缓解这些风险…

C ++ 学习之分文件 实现类

前言 当您在 C 中编写较大的程序时&#xff0c;将所有代码都放在一个文件中可能会变得混乱和不可维护。为了更好地组织代码并提高可维护性&#xff0c;您可以使用分文件实现&#xff08;Separate Compilation&#xff09;的概念。 正文 我的 circle.h 文件 #pragma once #i…

8、监测数据采集物联网应用开发步骤(6)

监测数据采集物联网应用开发步骤(5.3) 定时器插件化开发 在com.zxy.common.Com_Para.py中添加如下内容 #定时器正在运行标签 bTimeFlag False #定时器插件拦截器 TimeREFLECT_IN_CLASS "com.plugins.usereflect.testCustTimeReflectClass1" 创建自定义定时器执…

UE5 里的一些常用的了解

# ACharacter、APawn的继承关系 ACharacter -继承自-> APawn -继承自-> AActor和 INavAgentInterface AActor -继承自-> UObject -继承自->UObjectBaseUtility -继承自-> UObjectBase&#xff08;一个独立的类&#xff09;INavAgentInterface是一个独立的类 #…

vue v-on 艾特@

vue v-on 内联代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</titl…

多目标应用:基于多目标人工蜂鸟算法(MOAHA)的微电网多目标优化调度MATLAB

一、微网系统运行优化模型 参考文献&#xff1a; [1]李兴莘,张靖,何宇,等.基于改进粒子群算法的微电网多目标优化调度[J].电力科学与工程, 2021, 37(3):7 二、多目标人工蜂鸟算法MOAHA 多目标人工蜂鸟算法&#xff08;multi-objective artificial hummingbird algorithm&…

构建稳定的爬虫系统:如何选择合适的HTTP代理服务商

在构建一个稳定、高效的爬虫系统中&#xff0c;选择合适的HTTP代理服务商是至关重要的一步。本文将介绍如何选取可靠且性能优秀的HTTP代理服务供应商&#xff0c;来完成搭建一个强大而稳定的爬虫系统。 1.了解不同类型和特点 -免费公开代理服务器:提供免费但可能存在限制或不…

【Linux】目录结构、路径

目录 1. 目录结构 1.1 基本概念 1.2 具体的目录结构 2. 路径 2.1 绝对路径和相对路径 2.2 特殊路径符 1. 目录结构 1.1 基本概念 Linux的目录结构是一个树形结构。 Windows系统可以拥有多个盘符&#xff0c;如 C盘、D盘、E盘。Linux没有盘符这个概念&#xff0c;只有一…

一阴一阳之谓道,乃自然规律也!

阴阳&#xff0c;在我们国家&#xff0c;是一切传统文化的基础。作为一个有着五千年文化的国家&#xff0c;作为世界上仅存的四大文明古国&#xff0c;峰民觉得&#xff0c;我们的传统文化&#xff0c;不能被当成迷信&#xff0c;慢慢的没落。 有时&#xff0c;不得不承认&…

【100天精通python】Day50:python web编程_Django框架从安装到使用

目录 1 安装Django Web框架 2 创建一个Django 项目 3 数据模型 3.1 在应用程序的 models.py 文件中定义数据模 3.2 创建模型的迁移文件并应用 3.2.1 查询模型对象&#xff1a; 3.2.2 创建新模型对象&#xff1a; 3.2.3 更新模型对象&#xff1a; 3.2.4 删除模型对象&a…

BDCC - 闲聊数据仓库的架构

文章目录 典型数据仓库架构图数据仓库ETL vs ELTETLELT区别联系 数据仓库分层&#xff08;1&#xff09;数据仓库ODS层&#xff08;2&#xff09;数据仓库CDM层DWD数据明细层DWS数据汇总层 &#xff08;3&#xff09;数据仓库ADS层 典型数据仓库架构图 按自下而上的顺序&#x…

plsql ebs 工作中的简单笔记

工作流中给系统界面发送消息&#xff1a; PROCEDURE wf_notify(p_sender IN VARCHAR2 DEFAULT SYSADMIN,p_receiver IN VARCHAR2,p_subject IN VARCHAR2,p_content_text IN VARCHAR2);PROCEDURE wf_notify(p_sender IN VARCHAR2 DEFAULT SYSADMIN,---发送…

外贸企业如何借助CRM提升企业发展?

外贸企业竞争激烈&#xff0c;提高自身竞争力&#xff0c;扩大海外业务市场&#xff0c;是每个外贸企业的目标。为了实现这一目标&#xff0c;不少外贸企业借助CRM系统&#xff0c;优化业务流程&#xff0c;管理维护客户&#xff0c;从而实现可持续发展。那么&#xff0c;外贸企…