C++笔记(STL标准库)

1.STL六大部件

  • 容器 Containers
  • 分配器 Allocators:帮容器分配内存
  • 算法 Algorithms
  • 迭代器 Iterators:算法通过迭代器操作容器里的数据,是一种泛化的指针
  • 适配器 Adapters:修改或扩展已有类或函数的接口以满足特定的需求
  • 仿函数 Functors
int main()
{int ia[6] = {27, 210, 12, 47, 109, 83};vector<int, allocator<int>> vi(ia, ia+6);cout << count_if(vi.begin(), vi.end(), not1(bind2nb(less<int>(), 40)));system("pause");return 0;
}

vector 容器 allocator 分配器 count_if 算法

vi.begin() 迭代器 not1 适配器 less<int>() 仿函数

2.容器的内存分配

三种形式:Sequence Containers, Associative Containers, Unordered Containers

set和map的底层原理都是红黑树

3.auto 关键字

auto 关键字用于自动类型推导,让编译器基于初始化表达式来推断变量的类型。这样的语法可以使代码更简洁,减少在声明变量时需要显式指定类型的需求。

在代码 auto pItem = find(c.begin(), c.end(), target); 中:

  • find 是一个算法,通常在 <algorithm> 头文件中定义。它用于在给定的迭代器范围(这里是从 c.begin()c.end())内查找与 target 相等的第一个元素。
  • c 是一个容器,如 vector, list 或其他可迭代的容器。
  • target 是要在容器 c 中查找的元素。

auto pItem 表示让编译器自动推导 pItem 的类型。在这种情况下,find 函数返回的是一个迭代器,指向找到的元素。如果没有找到匹配的元素,它将返回 c.end(),表示范围的末尾。

因此,使用 auto 可以避免显式写出复杂的迭代器类型,使代码更易读和易维护。

4. snprintf

snprintf(buf, 10, "%d", rand());  // 将 rand() 函数生成的随机整数格式化为字符串

5.使用容器forward_list

forward_list<string> c;  snprintf(buf, 10, "%d", rand());
c.push_front(string(buf));  // 头插

6.stack和vector的区别

  • vector 是一个动态数组。允许随机访问,即可以直接通过索引访问任何元素。支持对容器中元素的前向和后向遍历。
  • stack 是一种先进后出的数据结构,只能在一端(栈顶)进行添加或删除操作。不支持随机访问,即不能直接访问栈内部的元素,只能访问栈顶元素

7.multiset/multimap

 

  • 安插元素用insert
  • 使用c.find<>比::find<>快
  • 可以放重复值

8.使用容器vector的操作

namespace test_vector
{string get_target_string(){long target = 0;char buf[10];cout << "target:" << endl;cin >> target;snprintf(buf, 10, "%ld", target);return string(buf);}void test_vector(long &value){vector<string> v;char buf[10];clock_t timeStart = clock();for(long i=0; i<value; i++){try{snprintf(buf, 10, "%d", rand());v.push_back(buf);}catch(exception& p){cout << "i=" << i << " " << p.what() << endl;abort();}}cout << "milli-seconds:" << (clock() - timeStart) << endl;cout << "vector.max_size()= " << v.max_size() << endl;	//1073747823cout << "vector.size()= " << v.size() << endl;		cout << "vector.front()= " << v.front() << endl;	cout << "vector.back()= " << v.back() << endl;	cout << "vector.data()= " << v.data() << endl;cout << "vector.capacity()= " << v.capacity() << endl << endl;string target = get_target_string();{timeStart = clock();auto p = find(v.begin(), v.end(), target);cout << "std::find(), milli-seconds : " << (clock()-timeStart) << endl;if(p != v.end()){cout << "found, " << *p << endl;}else{cout << "not found! " << endl;}}{timeStart = clock();sort(v.begin(), v.end());cout << "sort(), milli-seconds : " << (clock()-timeStart) << endl;timeStart = clock();auto p = lower_bound(v.begin(), v.end(), target);cout << "lower_bound(), milli-seconds : " << (clock()-timeStart) << endl;if (p != v.end())cout << "found, " << *p << endl << endl;elsecout << "not found! " << endl << endl;	}v.clear();}
}

9.常见的容器定义

// 单端数组
#include<vector>
vector<string> v;
// 双端队列
#include <deque>
deque<string> c;// 链表
#include <list>
#include <forward_list>
list<string> c;
forward_list<string> c;// 红黑树
#include <set>
#include <map>
set<string> v;
multiset<string> c;  // 插入元素用c.insert(string(buf))
map<int, string> c;
multimap<int, string> c;  // c.insert(pair<int, string>(i,buf))// 哈希表
#include <unordered_set>
unordered_set<string> c;
unordered_multiset<string> c;  	#include <unordered_map>
unordered_map<long, string> c;  
unordered_multimap<long, string> c;// 栈
#include <stack>
stack<string> c;  // 默认以deque为底层
stack<string, list<string>> c;		//以 list 為底層
stack<string, vector<string>> c;	//以 vector 為底層
stack<string, set<string>> c;	//以 set 為底層

10.使用分配器allocator

#include <memory>	//內含 std::allocator  //欲使用 std::allocator 以外的 allocator, 得自行 #include <ext\\...> 
#ifdef __GNUC__		
#include <ext\\array_allocator.h>
#include <ext\\mt_allocator.h>
#include <ext\\debug_allocator.h>
#include <ext\\pool_allocator.h>
#include <ext\\bitmap_allocator.h>
#include <ext\\malloc_allocator.h>
#include <ext\\new_allocator.h>  namespace test_allocator
{void test_allocator(int &value){list<string, allocator<string>> c1;						list<string, __gnu_cxx::malloc_allocator<string>> c2;  	list<string, __gnu_cxx::new_allocator<string>> c3; 		list<string, __gnu_cxx::__pool_alloc<string>> c4;  		list<string, __gnu_cxx::__mt_alloc<string>> c5; 		list<string, __gnu_cxx::bitmap_allocator<string>> c6;c.push_back(value);// 定义指针和分配器int* p; 	allocator<int> alloc1;// 分配内存:1表示要分配的对象数目。函数返回一个指向分配内存的指针。p = alloc1.allocate(1);// 释放内存alloc1.deallocate(p, 1);}// 使用 C 标准库中的 malloc 和 free 进行内存分配和释放__gnu_cxx::malloc_allocator<int> alloc2;  p = alloc2.allocate(1);  alloc2.deallocate(p,1);  	// 使用 C++ 的 new 和 delete 操作符进行内存分配和释放__gnu_cxx::new_allocator<int> alloc3; 	p = alloc3.allocate(1);  alloc3.deallocate(p,1); 	// 使用内存池技术进行内存管理.适用于频繁分配和释放小对象的场景__gnu_cxx::__pool_alloc<int> alloc4;  	p = alloc4.allocate(2);  alloc4.deallocate(p,2);// 设计用于多线程环境,可以安全地在多个线程中使用。__gnu_cxx::__mt_alloc<int> alloc5; 	p = alloc5.allocate(1);  alloc5.deallocate(p,1);  	// 使用位图来管理内存的分配和释放__gnu_cxx::bitmap_allocator<int> alloc6;  	p = alloc6.allocate(3);  alloc6.deallocate(p,3);
}

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

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

相关文章

Java13基础(StringBuilder和StringBuffer 包装类)

目录 一. StringBuilder和StringBuffer 扩容机制&#xff1a; 链式操作&#xff1a; 一些方法&#xff1a; 区别&#xff1a; 小结&#xff1a; 二. 包装类 创建对象&#xff1a; 自动装箱&#xff1a; 自动拆箱&#xff1a; 缓存池&#xff1a; 进制转换&#xff1…

亲测-wordpress文章实时同步发布修改删除多个站点的WP2WP插件

一款将wordpress文章同步到其他WordPress网站的插件&#xff0c;通过这款插件&#xff0c;可以保持不同博客之间文章发布、修改、删除的同步。 安装步骤&#xff1a; 主站和分站都要上传这个插件 1.把插件上传到wp-content\plugins解压出来wp2wp文件夹&#xff0c;然后启用插…

【数据结构】心里有 “B树“ 么?

序言 在学习数据库之前&#xff0c;博主觉得有必要学习B树系列&#xff0c;以便之后更好地了解其原理&#xff0c;既然说到这里了&#xff0c;那就再说几句&#xff0c;数据库是帮助我们管理存在硬件当中的数据&#xff0c;如果要从中读取数据&#xff0c;就要考虑到硬件的读取…

poll 机制

poll 机制 一、poll机制概述二、使用流程三、编程3.1 驱动编程3.1 应用编程 四、POLL 机制的内核代码详解五、编译后上机实验 poll 机制与休眠唤醒机制的区别&#xff1a; 休眠唤醒方式时&#xff0c;进程如果没有得到唤醒信号&#xff0c;需要一直休眠&#xff0c;进程就干不了…

企业数智化转型痛点

建设痛点 企业信息系统建设经历的三个阶段&#xff1a;信息化、网络化&#xff08;即我们常说的互联网&#xff09;、以及目前正在进行中的数智化。 企业数智化转型过程中&#xff0c;IT管理人员会面临以下问题困扰&#xff1a; 1&#xff0c;系统架构不规范 业务系统技术标准不…

React 中重新实现强制实施表单

就像设计人员一样&#xff0c;在添加逻辑之前&#xff0c;您需要为不同的状态“模拟”或创建“模拟”。例如&#xff0c;这里只是表单的视觉部分的模拟。这个模拟由一个 prop 控制&#xff0c;其默认值为 &#xff1a;statusempty 识别组件的不同视觉状态确定触发这些状态更改…

解决java.lang.IllegalArgumentException异常的正确方法

java.lang.IllegalArgumentException 是 Java 中的一个异常类&#xff0c;表示方法中传递的参数不合法。这个异常通常在方法被调用时抛出&#xff0c;表明方法的参数出现了问题。要正确解决这个异常&#xff0c;你可以按照以下步骤进行&#xff1a; 查看异常信息&#xff1a;首…

免费思维13招之七:空间型思维

免费思维13招之七:空间型思维 本篇给你带来的是空间型思维。 空间型思维,具体分为内部空间型思维和外部空间型思维。 什么叫内部空间型思维呢? 内部空间型就是充分利用现有空间或资源为社会提供免费服务,积累人气,增加流量,从而带动消费。 为什么你生意不好?为什么你…

iOS ------ MRC

一&#xff0c;MRC MRC&#xff1a;Manual reference Counting与ARC是两种不同的内存管理机制。ARC是自动引用计数&#xff0c;有编译器在编译时自动插入内存管理代码。而MRC是手动引用计数&#xff0c;开发者需要手动管理对象的引用计数。开发者需要手动调用retain&#xff0…

信息系统架构基本概念及发展_2.信息系统架构的定义

1.几种架构的定义 信息系统架构仍在不断发展中&#xff0c;还没有形成一个公认的定义&#xff0c;这里举出几个定义。 定义1&#xff1a;软件或计算机系统的信息系统架构是该系统的一个&#xff08;或多个&#xff09;结构&#xff0c;而结构由软件元素、元素的外部可见…

最全-全分辨率免ROOT免费脚本开发工具《懒人精灵》系统视频教程

---全分辨率免ROOT免费脚本开发工具《懒人精灵》--- 一、基础板块-视频教程 1.懒人精灵核心基础视频教程(一)&#xff1a;https://www.bilibili.com/video/BV1vr4y1P7hh/ 2.懒人精灵核心基础视频教程(二)&#xff1a;https://www.bilibili.com/video/BV1BB4y1X7rw/ 二、插件-…

ppt保存文件奇怪问题

我发现ppt中的形状保存成jpg,png和pdf时&#xff0c;格式不一样 比如 当右键单击时&#xff0c;然后选择另存为图片 png格式 jpg格式 pdf格式 感觉还是很奇怪&#xff0c;就pdf的格式比较靠谱一点

2024年建筑施工特种作业人员安全生产知识试题

100分题库提供安全员考试试题、建筑安全员考试预测题、建筑安全员ABC考试真题、安全员证考试题库等&#xff0c;提供在线做题刷题&#xff0c;在线模拟考试&#xff0c;助你考试轻松过关。 单选题&#xff08;1-10&#xff09; 1.因生产安全事故受损害的从业人员&#xff0c;除…

Busybox 在 Docker 中的部署和启动

可以使用 docker pull 指令下载 busybox:latest 镜像&#xff1a; PS C:\Users\yhu> docker pull busybox:latest latest: Pulling from library/busybox ec562eabd705: Pull complete Digest: sha256:5eef5ed34e1e1ff0a4ae850395cbf665c4de6b4b83a32a0bc7bcb998e24e7bbb St…

ElasticSearch集群环境

ElasticSearch集群环境 1、Linux单机 下载地址&#xff1a;LINUX X86_64 (elastic.co) 下载之后进行解压 tar -zxf elasticsearch-7.8.0-linux-x86_64.tar.gz 名字太长了改个名字改成es mv elasticsearch-7.8.0 es因为安全问题&#xff0c;Elasticsearch 不允许 root 用户…

性能优化 | el-table中内嵌大量el-input控件导致渲染卡顿的问题

场景 项目中有一个应用场景&#xff0c;用户需要在表单中大量使用选择框以及输入框填写数据&#xff08;每一行大概有三十几个输入框&#xff09;&#xff0c;当选择框与输入框达到一定数量的时候&#xff0c;页面会出现输入不连续、卡顿的现象&#xff0c;如下图&#xff1a;…

【信息系统项目管理师知识点速记】风险管理:规划风险管理

规划风险管理是确保项目风险得到有效管控的关键前期步骤,它为整个项目生命周期中识别、分析、应对和监控风险提供了蓝图。 核心目的 匹配度:确保风险管理策略与项目风险水平、组织及干系人重要性相匹配。适时调整:项目初期完成,但需在重大变动时重新评估和调整。输入要素 …

16.直方图均衡化

数字图像处理(17): 直方图均衡化处理 简介 直方图均衡化是一种简单有效的图像增强技术&#xff0c;通过改变图像的直方图来改变图像中各像素的灰度&#xff0c;主要用于增强动态范围偏小的图像的对比度。当原始图像的灰度分布较为集中的时候&#xff0c;可能造成图像不够清晰&…

如何高效率阅读文献

很多导师曾说&#xff0c;不应该花费超过30分钟阅读一篇论文&#xff0c;在某些特殊的时间段&#xff0c;30分钟甚至可能都算是太多的时间&#xff0c;比如&#xff1a;你正准备毕业论文或者想要发表论文的时候…… 文献阅读为何如此重要&#xff1f;又该如何有效快速的阅读&a…

C++基础与深度解析 | 什么是C++ | C++开发环境与相关工具 | C++编译/链接模型

文章目录 一、什么是C二、C的开发环境与相关工具三、C的编译/链接模型 一、什么是C C是一门比较流行的编程语言&#xff08;高级语言&#xff09;&#xff0c;同时也是一门复杂的语言。从TIOBE 编程社区指数中可以看出&#xff1a;在2024.04中&#xff0c;其编程语言受欢迎程度…