C++笔记(STL标准库)

news2024/11/28 0:39:57

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

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

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

相关文章

Python深度学习基于Tensorflow(9)注意力机制

文章目录 注意力机制是怎么工作的注意力机制的类型 构建Transformer模型Embedding层注意力机制的实现Encoder实现Decoder实现Transformer实现 注意力机制的主要思想是将注意力集中在信息的重要部分&#xff0c;对重要部分投入更多的资源&#xff0c;以获取更多所关注目标的细节…

2024最新商业视频打赏系统源码 多套模板 有代理后台 已对接支付

简介&#xff1a; 2024最新商业视频打赏系统源码 多套模板 有代理后台 已对接支付 图片&#xff1a; 源码下载

清华发布Temporal Scaling Law,解释时间尺度对大模型表现的影响

众所周知&#xff0c; 语言模型调参&#xff01; 预训练语言模型调参&#xff01;&#xff01; 预训练大语言模型调参&#xff01;&#xff01;&#xff01; 简直就是一个指数级递增令人炸毛的事情&#xff0c;小编也常常在做梦&#xff0c;要是只训练几步就知道现在的超参…

【优选算法】—Leetcode—11—— 盛最多水的容器

1.题目 11. 盛最多水的容器 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明&#…

K邻近算法

简介 介绍了非常简单的算法&#xff1a;K邻近算法&#xff0c;即KNN。 基本介绍 K-近邻算法&#xff08;K-Nearest Neighbors&#xff0c;简称KNN&#xff09;是一种基本且广泛应用的监督学习算法&#xff0c;主要用于分类和回归任务。 工作原理非常简答直观&#xff1a;所谓…

改变浏览器大小,图片(img)内容居中显示img标签,不是背景图

改变浏览器大小,图片&#xff08;img&#xff09;内容居中显示&#xff0c;img标签&#xff0c;不是背景图 效果直接上图&#xff1a; 上代码&#xff1a; <!DOCTYPE html> <html> <head><title>测试图片居中显示&#xff0c;高度不变只变宽度<…

面试集中营—Seata分布式事务

一、分布式事务 本地事务 在计算机系统中&#xff0c;更多的是通过关系型数据库来控制事务&#xff0c;这是利用数据库本身的事务特性来实现的&#xff0c; 因此叫数据库事务&#xff0c;由于应用主要靠关系数据库来控制事务&#xff0c;而数据库通常和应用在同一个服务器&am…

SQLite利用事务实现批量插入(提升效率)

在尝试过SQLite批量插入一百万条记录&#xff0c;执行时长高达20多分钟后&#xff0c;就在想一个问题&#xff0c;这样的性能是不可能被广泛应用的&#xff0c;更不可能出现在真实的生产环境中&#xff0c;那么对此应该如何优化一下呢&#xff1f; 首先分析一下批量插入的逻辑 …

社交媒体数据恢复:脉脉

在使用社交软件脉脉的过程中&#xff0c;可能会遇到数据丢失的情况&#xff0c;如误删了重要信息或者更换手机后数据未能同步等问题。那么如何恢复脉脉中的数据呢&#xff1f;本文将为您提供详细的步骤指导。 注意&#xff1a;以下操作需要在脉脉账户登录状态下进行。 登录脉…

红米K60Pro/K50/K40系列澎湃OS解锁BL降级出厂MIUI14稳定版本方法

最新红米K60/60pro/K50/K50至尊/K40等多个系列手机都已经推送了澎湃OS系统&#xff0c;但新版的系统适配周期短或者等其他原因&#xff0c;导致很多小伙伴希望降级回到MIUI14系统&#xff0c;多个小米售后都拒绝降级服务&#xff0c;并且官方也没有开通1个自助降级的方法&#…

速戳!高考生做近视手术须知,避免错过心仪大学

距离高考还有不到一个月的时间&#xff0c;考生们在紧张复习的同时&#xff0c;不要忘了了解意向专业、院校的视力要求。一些专业和院校录取不仅靠实力,还需要“视力”,考了个好成绩却因视力不达标而被专业、院校退档,这样的结果是我们不想看到的。如果你想圆军旅梦、警校梦、航…

软考--信息系统项目管理师课程笔记

第一章 信息化发展 1.国家信息化&#xff1a;应用&#xff08;上&#xff09;&#xff0c;技术&#xff08;下&#xff09;&#xff0c;人才&#xff08;左&#xff09;&#xff0c;规范&#xff08;右&#xff09; 2.广域网协议包括&#xff1a;ISDN&#xff0c;ASDL&#xf…

Android的视图显示和管理机制:layout view window WindowManager Canvas Surface

在Android系统中&#xff0c;Layout view window WindowManager Canvas Surface SurfaceFlinger这些组件协同工作&#xff0c;以实现图形的绘制和显示。需要搞明白这些组件是什么时候创建的以及他们之间的结构关系。 从上到下的层级关系&#xff1a;用户在View上进行操作&…

SQLite .journal 文件

在之前插入大量数据测试的时候&#xff0c;发现在数据库文件同级目录下会产生一个同名.journal的文件&#xff0c;并且不是一直会存在&#xff0c;而是生成一会就会自动删除&#xff0c;然后继续生成继续删除&#xff0c;直到数据插入完成。 初步猜测&#xff0c;应该是类似 re…

代码-功能-Python-运用bs4技术爬取汽车之家新闻信息

第三方库安装指令&#xff1a; pip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple pip install BeautifulSoup4 -i https://pypi.tuna.tsinghua.edu.cn/simple 运行代码&#xff1a; #这个代码并不完整&#xff0c;有很大的问题&#xff0c;但目前不知道怎么…

05-Fortran基础--Fortran文件操作

05-Fortran基础--Fortran文件操作 0 引言1 文件操作有关的关键字介绍1.1 打开文件&#xff08;OPEN&#xff09;1.2 文件关闭&#xff08;CLOSE&#xff09;1.3 文件查询&#xff08;INQUIRE&#xff09;1.3 文件读写&#xff08;read/write&#xff09;1.4 文件操作符&#xf…

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

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

设计模式——结构型模式——代理模式(静态代理、动态代理:JDK、CGLIB)

目录 代理模式 代理模式简介 代理模式的分类 代理模式组成 代理模式的优缺点 静态代理 背景前置 编写代码 JDK动态代理 编写代码 使用Arthas分析JDK动态代理底层原理 CGLIB动态代理 编写代码 三种代理的对比 代理模式使用场景 代理模式 代理模式简介 代理模式属…

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

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

重发布和路由策略实验(课堂练习)

需求&#xff1a; 将1.1.1.0/24网段&#xff08;不在OSPF中&#xff09;重发布到网络中&#xff0c;不允许出现次优路径&#xff0c;实现全网可达。 需求分析&#xff1a; 1、在R1上重发布1.1.1.0/24网段&#xff0c;但是需要过滤192.168.12.0/24和192.168.13.0/24 2、在R2和R3…