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

相关文章

亲测-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;进程就干不了…

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

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

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

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

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

HCIP【BGP综合实验】

目录 一、实验拓扑图&#xff1a; 二、实验要求&#xff1a; 三、实验思路&#xff1a; 四、实验步骤&#xff1a; 1、进行网段的子网划分&#xff08;整个实验总共有19条网段&#xff09;&#xff1a; (1)首先&#xff0c;根据实验要求&#xff0c;将172.16.0.0/16全部划…

2024湖南理工学院程序设计竞赛(同步赛) G. 区间递减(思维题 分类讨论 ST表)

题目 https://ac.nowcoder.com/acm/contest/82672/G 思路来源 出题人 涼風青葉7代码 题解 注意到三种情况即可&#xff0c; 第一种情况&#xff0c;10 9 8 1 2&#xff0c;保留1 第二种情况&#xff0c;6 5 10 9 4 4&#xff0c;保留5 4 4 第三种情况&#xff0c;6 5 4&…

jdk8的新特征

1&#xff1a; jdk8中新增的方法 在jdk8中对接口进行了增强&#xff0c;在jdk8之前 interface 接口名{ 静态常量&#xff1a; 抽象方法&#xff1a; } 在jdk8之后 interface 接口名{ 静态常量&#xff1a; 抽象方法&#xff1a; 默认方法&#xff1a; 静态方法&#xff1a; } 2…

JAVA基础--IO

IO 什么是IO 任何事物提到分类都必须有一个分类的标准&#xff0c;例如人&#xff0c;按照肤色可分为&#xff1a;黄的&#xff0c;白的&#xff0c;黑的&#xff1b;按照性别可分为&#xff1a;男&#xff0c;女&#xff0c;人妖。IO流的常见分类标准是按照*流动方向*和*操作…

Google与哈佛大学的科学家团队共同创造了一张人脑中一个极小部分的精细地图

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

插件:Best HTTP

一、简介 WebSocket WebSocket使得客户端和服务器之间的数据交换变得更加简单&#xff0c;允许服务端主动向客户端推送数据。在WebSocket API中&#xff0c;浏览器和服务器只需要完成一次握手&#xff0c;两者之间就直接可以创建持久性的连接&#xff0c;并进行双向数据传输。…

【SRC实战】无法支付的修改金额支付漏洞

挖个洞先 https://mp.weixin.qq.com/s/F4f8R4uKN0Q9BnTmjDMleg “ 以下漏洞均为实验靶场&#xff0c;如有雷同&#xff0c;纯属巧合 ” 01 — 漏洞证明 一、企业用户&#xff0c;标准商品 “ 支付订单需要公对公银行卡转账&#xff0c;如何绕过&#xff1f;” 1、点击任意…

java入门-面向对象的三大特性

面向对象三大特性 封装 什么是封装 封装 是将代码及其处理的数据绑定在一起的一种编程机制&#xff0c;该机制保证了程序和数据都不受外部干扰且不被误用。 封装的作用 访问控制符 方法传参-值传递 传参类型是基本类型 程序案例&#xff1a; public static void main(St…

C++笔记(体系结构与内核分析)

1.OOP面向对象编程 vs. GP泛型编程 OOP将data和method放在一起&#xff0c;目的是通过封装、继承、多态提高软件的可维护性和可扩展性GP将data和method分开&#xff0c;可以将任何容器与任何算法结合使用&#xff0c;只要容器满足塞饭所需的迭代器类型 2.算法与仿函数的区别 …

AJAX前端与后端交互技术知识点以及案例

Promise promise对象用于表示一个异步操作的最终完成&#xff08;或失败&#xff09;及其结果值 好处&#xff1a; 逻辑更清晰了解axios函数内部运作机制成功和失败状态&#xff0c;可以关联对应处理程序能解决回调函数地狱问题 /*** 目标&#xff1a;使用Promise管理异步任…