当前位置: 首页 > news >正文

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;
}

相关文章:

STL的学习之一

1&#xff09;STL扫盲 1&#xff09;C标准库和标准模板库是不一样的 2&#xff09;标准模板库是用泛型编程方式编写的函数或者类库; 3) SGI STL linux一般用&#xff0c;P.J.Plauger STL,visual2017 windows用 STL六大组件 : 容器&#xff0c;迭代器 STL 算法(说白了就是函数…...

如何使用Python进行数据科学实验?

使用Python进行数据科学实验通常需要以下步骤&#xff1a; 以上仅为使用Python进行数据科学实验的基本步骤&#xff0c;具体实验过程会根据具体问题和数据集的特点而有所不同。可以进一步学习和探索相关的数据科学和机器学习技术&#xff0c;以提高实验的效果和表现。 安装Pyt…...

华为数通方向HCIP-DataCom H12-821题库(拖拽题,知识点总结)

以下是我在现有题库中整理的需要重点关注的考点内容,如有遗漏小伙伴可以留言补充。...

第三课:C++实现PDF去水印

PDF去水印是一项非常复杂的任务,需要一定的计算机图形学知识和技术,也需要使用到一些专业的工具库。以下是一种可能的实现方法: 首先,需要将PDF文件解析成一系列图形元素,包括文字、矢量图形等。可以使用开源库Poppler或MuPDF来解析PDF文件。 接下来,需要判断PDF文件是否…...

实现Android分布式协同办公:将待办事件App与本地Web服务结合

AndServer AndServer 是 Android 平台的 Web Server 和 Web Framework,它基于编译时注解提供了类似 SpringMVC 的注解和功能。 Github :https://github.com/yanzhenjie/AndServer使用文档:https://yanzhenjie.com/AndServer/业务需求 实现待办事件APP本地启动Web服务,将本…...

VMware12.1.1安装Centos7

VMware12.1.1安装Centos7 1、下载相关软件 1.1 Centos7下载 官方下载链接&#xff1a; http://isoredirect.centos.org/centos/7/isos/x86_64/CentOS-7-x86_64-DVD-1511.iso 1.2 VMware Workstation下载 VMware Workstation 12.1.1官方原版下载&#xff1a; https://dow…...

bazel构建原理

调度模型 传统构建系统有很多是基于任务的&#xff0c;例如 Ant&#xff0c;Maven&#xff0c;Gradle。用户可以自定义"任务"(Task&#xff09;&#xff0c;例如执行一段 shell 脚本。用户配置它们的依赖关系&#xff0c;构建系统则按照顺序调度。 基于 Task 的调度…...

matlab 点云的二进制形状描述子

目录 一、功能概述1、算法概述2、主要函数3、参考文献二、代码示例三、结果展示四、参数解析输入参数名称-值对应参数输出参数五、参考链接本文由CSDN点云侠原创,...

MongoDB实验——在Java应用程序中操作 MongoDB 数据

在Java应用程序中操作 MongoDB 数据 1. 启动MongoDB Shell 2. 切换到admin数据库&#xff0c;使用root账户 3.开启Eclipse&#xff0c;创建Java Project项目&#xff0c;命名为MongoJava File --> New --> Java Project 4.在MongoJava项目下新建包&#xff0c;包名为mo…...

java+springboot+mysql校园跑腿管理系统

项目介绍&#xff1a; 使用javaspringbootmysql开发的校园跑腿管理系统&#xff0c;系统包含超级管理员&#xff0c;系统管理员、用户角色&#xff0c;功能如下&#xff1a; 超级管理员&#xff1a;管理员管理&#xff1b;用户管理&#xff08;充值&#xff09;&#xff1b;任…...

ubuntu20.04 server 安装后磁盘空间只有一半的处理

这里扩展&#xff1a;/dev/mapper/ubuntu–vg-ubuntu–lv rootbook:/data# df -h Filesystem Size Used Avail Use% Mounted on udev 3.9G 0 3.9G 0% /dev tmpfs 795M 1.2M 79…...

〔017〕Stable Diffusion 之 常用模型推荐 篇

✨ 目录 🎈 模型网站🎈 仿真系列🎈 国风系列🎈 卡通动漫系列🎈 3D系列🎈 一些好用的lora模型🎈 模型网站 由于现在大模型超级多,导致每种画风的模型太多,那么如何选择最好最适合的模型,成了很多人头疼的问题由于用的大部分都是1.5的模型,所以优先下载 safete…...

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

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

【HTML5】HTML5 特性

HTML5 特性 1. 语义化标签 <header>&#xff1a;表示网页或某个区域的页眉部分&#xff0c;通常包含网站的标志、导航菜单等内容。<nav>&#xff1a;表示导航区域&#xff0c;用于包含网站的主要导航链接。<main>&#xff1a;表示网页的主要内容区域&#…...

【FreeRTOS】互斥量的使用与逐步实现

在FreeRTOS中&#xff0c;互斥量是一种用于保护共享资源的同步机制。它通过二进制信号量的方式&#xff0c;确保在任意时刻只有一个任务可以获取互斥量并访问共享资源&#xff0c;其他任务将被阻塞。使用互斥量的基本步骤包括创建互斥量、获取互斥量、访问共享资源和释放互斥量…...

Spring-Cloud-Openfeign如何传递用户信息?

用户信息传递 微服务系统中&#xff0c;前端会携带登录生成的token访问后端接口&#xff0c;请求会首先到达网关&#xff0c;网关一般会做token解析&#xff0c;然后把解析出来的用户ID放到http的请求头中继续传递给后端的微服务&#xff0c;微服务中会有拦截器来做用户信息的…...

OpenCV(十一):图像仿射变换

目录 1.图像仿射变换介绍 仿射变换&#xff1a; 仿射变换矩阵&#xff1a; 仿射变换公式&#xff1a; 2.仿射变换函数 仿射变换函数&#xff1a;warpAffine() 图像旋转&#xff1a;getRotationMatrix2D() 计算仿射变换矩阵&#xff1a;getAffineTransform() 3.demo 1.…...

多路波形发生器的控制

本次波形发生器&#xff0c;主要使用运算放大器、NE555以及一些其他的电阻电容器件来实现。整体电路图如下所示&#xff1a; 产生的三角波如下&#xff1a; 正弦波如下 方波如下&#xff1a; 运算放大器&#xff08;Operational Amplifier&#xff0c;简称OP-AMP&#xff09;是…...

[C/C++]天天酷跑超详细教程-中篇

个人主页&#xff1a;北海 &#x1f390;CSDN新晋作者 &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏✨收录专栏&#xff1a;C/C&#x1f91d;希望作者的文章能对你有所帮助&#xff0c;有不足的地方请在评论区留言指正&#xff0c;大家一起学习交流&#xff01;&#x1f9…...

面试被打脸,数据结构底层都不知道么--回去等通知吧

数据结构之常见的8种数据结构&#xff1a; -数组Array -链表 Linked List -堆 heap -栈 stack -队列 Queue -树 Tree -散列表 Hash -图 Graph 数据结构-链表篇 Linklist定义&#xff1a; -是一种线性表&#xff0c;并不会按线性的顺序存储数据&#xff0c;即逻辑上相邻…...

LLM成长笔记(六):RAG(检索增强生成)

RAG&#xff08;检索增强生成&#xff09;全栈学习博客&#xff08;通俗原理 详细注释 AI应用强化版&#xff09; RAG 是让大模型“能回答它没学过的新知识”的核心架构。这篇博客从实际问题出发&#xff0c;用生活化类比建立直觉&#xff0c;通过术语详解深入概念本质&#…...

互联网大厂 Java 求职面试实战:音视频场景中的技术挑战

互联网大厂 Java 求职面试实战&#xff1a;音视频场景中的技术挑战在这个互联网飞速发展的时代&#xff0c;越来越多的求职者走进了大厂的面试现场。今天&#xff0c;我们将跟随一位搞笑的程序员燕双非&#xff0c;来看看他在面试中的表现&#xff0c;以及他如何应对各种技术问…...

Qt5 super module网络编程指南:WebSocket、HTTP、MQTT通信实现

Qt5 super module网络编程指南&#xff1a;WebSocket、HTTP、MQTT通信实现 【免费下载链接】qt5 Qt5 super module 项目地址: https://gitcode.com/gh_mirrors/qt/qt5 Qt5 super module是一个功能强大的跨平台应用程序开发框架&#xff0c;提供了丰富的网络编程功能&…...

ElevenLabs支持广西话吗?2024最新实测结果曝光:仅2个API参数决定能否合成地道“梧州腔”

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;ElevenLabs广西话语音支持的现状与背景 ElevenLabs 作为全球领先的AI语音合成平台&#xff0c;目前尚未在官方API文档、语言列表或控制台界面中提供对广西话&#xff08;含南宁白话、梧州话、玉林话等粤…...

大模型落地最后一公里:测试人员的新机会来了

从“质量守门员”到“AI摆渡人”当所有人都在谈论大模型如何颠覆开发模式时&#xff0c;一个隐秘而深刻的变革正在我们测试领域悄然发生。随着2026年大模型技术从“玩具”进化到“工具”&#xff0c;再到如今与企业核心业务的深度融合&#xff0c;横亘在理想与现实之间的“最后…...

AI部署风险评估:94%准确率为何引发生产灾难

1. 这不是AI的失败&#xff0c;是风险认知体系的塌方 “94%准确率”——这个数字像一枚镀金勋章&#xff0c;挂在每个技术团队的功劳簿上。它出现在季度汇报PPT第一页&#xff0c;写进投资人尽调材料的核心指标栏&#xff0c;甚至被印在内部庆功蛋糕的奶油裱花里。可当这枚勋章…...

Godot开源RPG框架选型与状态契约构建指南

1. 这不是又一个“Godot入门教程”&#xff0c;而是一套可落地的RPG世界构建方法论 你有没有试过打开Godot&#xff0c;新建一个项目&#xff0c;拖进几个精灵&#xff0c;写两行 move_and_slide() &#xff0c;然后卡在“接下来该做什么”上&#xff1f;我做过——整整三年前…...

免费去水印工具哪个好用?2026年免费去水印工具对比与推荐指南

在2026年&#xff0c;随着短视频、直播、自媒体创作的普及&#xff0c;去水印需求越来越多。无论是保存喜欢的视频素材、整理图片资源&#xff0c;还是创意二次加工&#xff0c;选择一款好用的免费去水印工具就成了刚需。市场上去水印工具众多&#xff0c;到底哪个免费版本值得…...

【CDA干货】用这4种数据分析思维,拆解爆款视频密码

很多做视频的人&#xff0c;发视频全凭感觉。今天视频火了&#xff0c;不知道为什么&#xff1b;明天流量掉了&#xff0c;也不知道哪里出了问题。其实&#xff0c;爆款背后从来不是运气&#xff0c;而是数据的逻辑。用数据分析思维做视频账号&#xff0c;就是把那些说不清道不…...

函数递归调用原理

1. 什么是递归 2. 递归的举例 3. 递归与迭代1. 什么是递归递归就是一种解决方法&#xff0c;在C语言中&#xff0c;递归就是函数调用自己。下面是一个简单的递归C语言程序&#xff1a;#include <stdio .h>int main(){printf("hello world\n");main();//main函数…...