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;	//1073747823
        cout << "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;
            else
                cout << "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);
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

自动秒收录网址导航分类目录模板

自动秒收录网址导航是一个以html5css3进行开发的免费版网址自动收录模板源码。 模板特点&#xff1a;全站响应式H5网站制作技术&#xff0c;一个网站适应不同终端&#xff0c;模板支持网址导航一键采集入库&#xff0c;免规则文章资讯智能批量采集内置伪原创&#xff0c;本地化…

DSA理解理解蓝桥杯例题signature

一、历史 1991年8月&#xff0c;NIST&#xff08;Nation Institute of Standards and Technology&#xff0c;美国国家标准技术研究所&#xff09;提出了数字签名算法&#xff08;DSA&#xff09;用于他们的数字签名标准&#xff08;DSS&#xff09;中。 DSA是算法&#xff0c…

SCI论文发表:寻找论文选题的7种方法 (建议收藏)!

我是娜姐 迪娜学姐 &#xff0c;一个SCI医学期刊编辑&#xff0c;探索用AI工具提效论文写作和发表。 近期有好几个同学问娜姐关于论文选题的问题&#xff1a;什么样的选题是好的选题-有价值好发表。这篇来分享7种寻找有效选题的方法。 在我们寻找论文选题的过程中&#xff0c;…

Linux配置两个局域网间的网络转发

网络拓扑如上图所示&#xff0c;有192.168.1.0(255.255.255.0)&#xff0c;192.168.2.0(255.255.255.0)两个局域网。若要使host1可直接通过ip地址访问host3&#xff0c;则需在host2中配置路由转发。 host2 配置静态路由&#xff08;系统一般会自动配置&#xff09; # 添加静…

Electron、QT、WPF三强争霸,该支持谁呢?

Electron、QT、WPF都是跨平台的桌面应用开发框架&#xff0c;都是非常流行的&#xff0c;作为开发者该选用哪个呢&#xff1f;本文从多个角度分析一下。 一、定义 Electron、Qt 和 WPF 都是用于创建桌面应用程序的框架或工具&#xff0c;它们各自有着不同的特点和优势。 Elec…

Windows下安装 Emscripten 详细过程

背景 最近研究AV1编码标准的aom编码器&#xff0c;编译的过程中发现需要依赖EMSDK&#xff0c;看解释EMSDK就是Emscripten 的相应SDK&#xff0c;所以此博客记录下EMSDK的安装过程&#xff1b;因为之前完全没接触过Emscripten 。 Emscripten Emscripten 是一个用于将 C 和 …

论文盲审吐槽多,谁给盲审不负责的老师买单?如何看待浙江大学「一刀切」的研究生学位论文双盲评审制度?

::: block-1 “时问桫椤”是一个致力于为本科生到研究生教育阶段提供帮助的不太正式的公众号。我们旨在在大家感到困惑、痛苦或面临困难时伸出援手。通过总结广大研究生的经验&#xff0c;帮助大家尽早适应研究生生活&#xff0c;尽快了解科研的本质。祝一切顺利&#xff01;—…

Windows11“重置此电脑”后,Edge浏览器在微软应用商店显示“已安装”,但是开始菜单搜索不到的解决办法

Windows11“重置此电脑”后&#xff0c;Edge浏览器在微软应用商店显示“已安装”&#xff0c;但是开始菜单搜索不到的解决办法 为什么重新使用Edge&#xff1f;问题描述不该更新可用更新问过AI&#xff08;通义千问&#xff09;&#xff0c;并且AI提供方法全都无效。现象 操作步…

<MySQL> 数据库基础

目录 一、数据库概念 &#xff08;一&#xff09;什么是数据库 &#xff08;二&#xff09;数据库存储介质 &#xff08;三&#xff09;常见数据库 二、数据库基本操作 &#xff08;一&#xff09;连接数据库 &#xff08;二&#xff09;使用数据库 &#xff08;三&…

免费PDF批量加密工具

最近在找PDF批量加密的软件来着&#xff0c;发现很多都是需要收费的&#xff0c;当然如果平时工作需要用的比较多&#xff0c;支持一下还是ok的&#xff0c;但是多数人还是偶尔用一下所以没有必要买。 工作用的话&#xff0c;一般企业文件、个人隐私资料、重要合同...所有重要文…

测试萌新三天速通python基础(二)列表,字符串,元组,字典,遍历,容器,集合,函数

python基础 字符串下标(索引)切片字符串的替换 replace()字符串拆分 split()字符串的连接 join列表 list列表的增删改查列表的反转 reverse()排序列表嵌套元组 tuple 排序 升序降序交换变量字典 dict查询遍历容器集合函数参数函数的嵌套调⽤函数的返回值模块导⼊的⽅法____name…

YOLOv8独家原创改进: AKConv(可改变核卷积)

1.AKConv原理介绍 地址:2311.11587 (arxiv.org) 摘要:基于卷积运算的神经网络在深度学习领域取得了令人瞩目的成果,但标准卷积运算存在两个固有的缺陷。一方面,卷积运算仅限于局部窗口,无法捕获其他位置的信息, 并且它的采样形状是固定的。 另一方面,卷积核的大小固定为…

中国速度!滑湿人自己的MFC第一课!

前言&#xff1a; 这&#xff01;是一个&#xff01;新的专栏&#xff01; 因为&#xff01;面向对象的程序设计&#xff01;已经&#xff01;学的差不多了&#xff01; 我谭哥那本大厚书&#xff01;也快&#xff01;学完了&#xff01; 于是&#xff01;sgq&#xff01;为…

springboot+layuimini实现树形表格

树形表格实现增删改查 这里写目录标题 效果图前端页面代码前端插件后端代码controllerserviceserviceImpl 实现类Entitymapperxml mybatis代码数据表 效果图 前端页面代码 <!DOCTYPE html> <html lang"en" xmlns:th"http://www.thymeleaf.org"&g…

【机器学习300问】87、学习率这种超参数在优化时选择随机搜索方法,为什么要在对数尺度范围进行随机搜索?

在超参数优化过程中&#xff0c;对数尺度范围进行随机采样对于某些类型的超参数来说是非常有效的&#xff0c;特别是当超参数的有效值跨越几个数量级时。学习率就是这样一种超参数&#xff0c;它可以从非常小&#xff08;例如&#xff09;到相对大的值&#xff08;例如&#xf…

Vscode----远程服务器改名

问题描述 一开始Autodl服务器机子很多,但是我使用vscode的时候他们的名字都一样,导致每次要打开机子是都需要重新输入ssh和密码 解决方法 修改vscode端服务器的名字即可解决 打开远程设置,选择你的ssh配置文件 将Host改为你想要的名字,保存刷新即可 点击访问博客查看更多…

机器学习作业4——朴素贝叶斯分类器

目录 一、理论 一个例子&#xff1a; 二、代码 对于代码的解释&#xff1a; 1.fit函数&#xff1a; 2.predict函数: 三、实验结果 原因分析&#xff1a; 一、理论 朴素贝叶斯分类器基于贝叶斯定理进行分类&#xff0c;通过后验概率来判断将新数据归为哪一类。通过利用贝…

“知识世界”项目的自动化测试

目录 1.项目介绍 1.1 项目功能介绍 2. 项目测试 2.1 需求分析 2.2 测试计划 2.3 设计测试用例 &#xff08;1&#xff09; 设计 登录 的测试用例 &#xff08;2&#xff09;设计 文章列表页 的测试用例 &#xff08;3&#xff09;设计 详情页 的测试用例 &#xff08…

线下研讨会 技术沙龙|乐鑫芯片与 ESP RainMaker® 为科技初创企业赋能

众多科技初创企业在智能硬件市场迅猛发展的背景下&#xff0c;对不断变化的需求展现出了高度的敏锐性&#xff0c;期望能够快速将其转化为切实的产品方案。然而&#xff0c;面对复杂繁重的软硬件集成任务&#xff0c;这些企业往往容易陷入研发瓶颈、资金短缺以及效率低下等多重…

BGP综合大实验

实验要求 1.AS1中存在两个环回&#xff0c;一个地址是192.168.1.0/24&#xff0c;改地址不能在任何协议中宣告&#xff1b;AS3中存在两个环回&#xff0c;一个地址为192.168.2.0/24&#xff0c;该地址不能在任何协议中宣告&#xff0c;最终要求这两个环回可以ping通&#xff1b…