STL------通用工具

STL概览-通用工具pair,auto_ptr,std::rel_ops(二) C++标准库中的通用工具,他们多是短小精悍的函数或者类,完成那些最一般的工作,大致如下:  ============================================================对组||->名称----->pair|->动机----->方便|->思想----->结构|->应用----->如果某个函数要求传回两个值,可能比较有用| 阅读详情

1.1 Pairs(对组)

 

  class pair可以将两个值视为一个单元。stl内多出使用了这个class,尤其容器类别map和multimap,就是使用pairs来管理其键值/实值(key/value)的成对元素。任何函数需返回两值,也需要pair。

Structure pair定义于<utility>:

namespace std{

  template<class T1,class T2>

  struct pair{

    //type names for the values

    typedef T1 first_type;

    typedef T2 second_type;

   

    //member

    T1 first;

    T2 second;

   

    /*default constructor

    *-T1() and T2() force initialization for built-in types

    */

   pair()

     :first(T1()),second(T2()){

   }

 

  //constructor for two values

  pair(const T1& a,const T2&b)

  :fist(a),second(b){

  }

  

  //copy constructor with implicit conversions

  template<class U,class V>

  pair(const pair<U,V>& p)

  : first(p.first),second(p.second){

  }

 
  };

}

 

//comparisons

template <class T1,class T2>

bool operator==(const pair <T1,T2>&, const pair<T1,T2>&);

....//similar :!=,<,>,>=,<=

 

//convenience function to create a pair

template<class T1,class T2>

pair<T1,T2> make_pair(const T1&,const T2&);

 

pair之间的比较

  为了比较两个pair对象,如果两个pair对象的所有元素都相等,才视为相等(equal)

  namespace std{

    template<class T1,class T2>

    bool operator==(const pair<T1,T2>& x,const pair<T1,T2>& y){

      return x.first==y.first && x.second==y.second;

    }

  }

 

1.1.1 便捷函数make_pair()

  template function make_pair()使你无需写型别,就可以生成一个pair对象:

 

namespace std{

  //create value pair only by providing the values

  template<class T1,class T2>

  pair<T1,T2> make_pair(const T1&x,const T2&y){

    return pair<T1,T2>(x,y);

  }

}

 

 

 

1.2 Class auto_ptr

 

  本节描述auto_ptr型别。C++ STL提供的auto_ptr是一种智能型指针(smart_point),帮助程序员防止"被异常抛出时发生资源泄露"。auto_ptr只是针对某个问题而设计,对于其它问题,auto_ptr无能为力。

 

1.2.1 auto_ptr设计动机

 

  函数的操作经常依以下模式进行:

1.获取一些资源;

2.执行一些动作;

3.释放所获取的资源;

 

如果一开始获取的资源被绑定于局部对象(local objects)身上,当函数退出时,它们的析构函数(destructor)被调用,从而自动释放这些资源。然而事情并不总是如此顺利,如果资源是显示手法(explicitly)获得,而且没有被绑定在任何对象身上,那就必须以显示手法释放。这种情形常常发生在指针身上。

 

一个典型的例子就是运用new和delete来产生和销毁对象:

void f()

{

  classA* ptr =new classA;//create an object explicitly;

  ...                               //peform some operations

  delete ptr;                    //clean up(destrory the object explicitly)

}

 

这个函数是麻烦的根源,我们经常会忘记delete动作,防止这种资源遗失的常见办法是捕捉所有异常。例如:

 

void f()

{

   classA* ptr=new classA;

   try{

     ....                //peform some operations

   }

   catch(...){ //for any exception

     delete ptr;    //clean up

     throw;          //rethrow the exception

   }

   delete prt;          //clean up on normal end

}

 

 

如果使用智能指针,情况大不一样。

 

  auto_ptr是这样的指针:它是"它所指的对象"的拥有者(owner)。所以,当身为对象拥有者的auto_ptr被摧毁时,该对象也将被摧毁。auto_ptr要求一个对象智能有一个拥有者,严禁一物二主。

 

下面是上面改写后的版本;

//header firle for auto_ptr

#include<memory>

 

void f()

{

   //create and initialize an auto_ptr

   std::auto_ptr<Class A> ptr(new ClassA);

 

   ....        //peform some operations

}

 

不再需要delete ,也不需要catch。auto_ptr的借口与一般指针非常相似:

operator* 用来提取所指对象,operator->用来指向对象中的成员。然而,所有指针(包括++)都没有定义(这可能是件好事,因为指针算术本是一大麻烦来源)。

 

 

注意:auto_ptr<>不允许使用一般指针惯用的assign初始化方式,必须直接使用数值完成初始化:

 

std::auto_ptr<ClassA> ptr(new ClassA); //OK

std::auto_ptr<ClassA>ptr2 =new ClassA;   //ERROR

 

1.2.2 auto_ptr拥有权(Ownership)的转移

 

  auto_ptr所界定的乃是一种严格的拥有权观念。也就是说,由于一个auto_ptr会删除所指定对象,所以这个对象绝对不能同时被其它对象"拥有"。绝对不应该出现多个autor_ptrs同时拥有一个对象的情况。

 

  这个条件导致了一个问题:auto_ptr的copy构造函数和assignment操作符应该如何运作呢?

  令auto_ptr的copy构造函数和assignment操作符将对象拥有权交出去。下例:copy构造函数的运用:

 

  //initialize an auto_ptr with a new object

  std::auto_ptr<ClassA> ptr1(new ClassA);

 

 //copy the auto_ptr

 //--transfer ownership from ptr1 to ptr2

 std::auto_ptr<ClassA> ptr2(ptr1);

 

....待续

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

C++中高效实现map.values():从STL容器到通用工具函数设计 在C++编程中,STL容器是数据存储与操作的核心基础。关联容器如std::map通过键值对结构提供高效查找,其底层通常基于红黑树实现,确保了元素的有序性与操作稳定性。这种设计在需要快速检索的场景中极具技术价值,广泛应用于配置管理、缓存系统和数据索引等领域。然而,与Java、Python等语言不同,C++标准库未直接提供提取所有值集合的成员函数,开发者常需手动遍历或借助算法转换。本文聚焦std::map.values()功能的实现,深入探讨如何通过模板元编程、内存预分配(reserve)及移动语义优化,构建高 阅读详情

相关推荐

C++标准模板库方法STL和函数使用说明

STL提供了一组表示容器,迭代器,函数对象和算法的模板。(1)容器是一个与数组类似的单元,用来存储值,且存储的值的类型相同;(2)迭代器能够用来遍历容器的对象,与能够遍历数组的指针类型;(3)函数对象和算法是完成特定任务的发给发,类似有排序查找等 0.非成员函数的方法 如果要为每一个容器类型,单独定义一个排序,查找的方法,则工作量会非常巨大,并且很多都是重复性的工作,因此STL定义了非成员函数,来完成通用的容器算法,如sort(),find(),swap().如果该容器类型vector.swap()存在,则

geditzh的博客 528

obj转stl_介绍一种修复、查看以及打印STL三维模型文件的工具

slic3r是一种3D打印切片软件,这里可以帮助大家用于协助修复STL文件,并能帮助设定3D打印选项的小工具,下载后免安装直接可以用。官方网站点击左下角查看原文。我们也知道3D打印爱好者必不可少的也是这个软件。软件下载后解压后目录分布通常长这个样子软件界面如下图。可以看到,打开文件默认自动修复错误点击view/cut后,能看到可以导出为obj格式,导出的obj格式必定可以直接用于G4的C...

weixin_39607447的博客 1775

生成对抗网络——CGAN(代码+理解)

CGAN(Conditional Generative Adversarial Network)模型是一种 深度学习模型,属于生成对抗网络(GAN)的一种 变体。它的 基本思想是通过 训练生成器和判别器两个网络,使生成器能够生成与给定条件 相匹配的 合成数据,而判别器则 负责区分真实数据和 生成数据。相比于GAN它引入了条件信息(y),使得生成器可以生成与给定条件相匹配的合成数据,从而提高了生成数据的可控性和针对性。

CXDNW的博客 1万+

STL通用工具

模板函数的可移植性: 只有在头文件中以inline function的方式实现template function。 而目前,template必须定义在头文件中。 非类型模板参数Nontype Template参数: bitset的使用是,传入数值而非类型参数,代表位集的大小。 缺省的模板参数: 关键字:typename 如果typename T::subType *ptr;  限定

383

从零到一:手把手教你用C# WinForms搭建工控上位机(含Panel控件布局与事件处理详解)

本文详细介绍了如何使用C# WinForms框架从零开始搭建工控上位机系统,重点讲解了Panel控件的布局技巧和事件处理机制。通过实战案例,帮助开发者掌握界面分区规划、动态窗体切换及数据通信等核心功能,适用于工业自动化监控系统的开发。

weixin_30321709的博客 609

Python xlwings报错解决:从‘NoneType‘到完美运行WPS表格的完整指南

本文深入解析了使用Python xlwings库自动化WPS表格时遇到的经典'NoneType'报错(AttributeError: 'NoneType' object has no attribute 'apps')的根源与解决方案。核心在于pywin32版本与WPS的兼容性问题,文章提供了从版本降级、依赖管理到构建健壮自动化环境的完整实战指南,帮助开发者彻底解决兼容性难题,实现稳定运行。

n4o5p6q7r的博客 303

C++ :STL标准库:通用工具

C++ :STL标准库:通用工具

C++ JAVA的专栏 160

[Python] 为什么你的脚本明明没报错,却什么也没发生?

Python脚本运行后没报错却没结果?这是许多开发者遇到的棘手问题。文章分析了六种常见原因:代码未进入目标逻辑分支、输出路径错误、中间数据为空、异常被吞掉、异步操作未完成、运行了错误脚本版本。建议通过"过程可视化"排查,如打印关键变量、检查工作目录、验证数据状态等。职场中更应关注结果验证而非单纯代码执行,确保脚本真正解决问题。建立结果验证意识是从"会写代码"到"稳定交付"的关键转变。

技术小甜甜:传播可落地技术,帮助个人和企业降低解决真实场景问题的成本 303

STL学习笔记之通用工具

STL学习笔记之通用工具                   1 Pairs(对组) Class Pair 可以将两个值视为一个单元。C++标准程序库中多处使用了这个Class。容器类别Map和Multimap就是使用该类来管理其键值/实值的承兑元素的。任何函数需要两个值,也

Dony的专栏 773

智联招聘Python岗位数据采集:基于API请求的校园招聘信息爬取实战

本项目开发了一个智联招聘Python岗位校园招聘数据采集系统,采用requests库直接调用API接口获取结构化数据。系统通过分析API接口结构,配置完整的请求头、Cookie和身份验证参数,实现了10页数据的批量采集。采集内容包括工作名称、薪资范围、企业信息等10个关键字段,并存储为Excel格式。项目严格遵守网络爬虫规范,合理控制请求频率,数据仅用于技术学习和就业分析。技术实现涉及API逆向工程、JSON数据处理、防御性编程等核心技能,为学生职业规划和教育机构教学改革提供数据支持。

那些看似不起波澜的日复一日,会在某天让你看到坚持的意义 626

【华为OD机试】真题-小明减肥(Java)

摘要:题目要求从n个可选运动中选取k个,使其卡路里总和等于目标值t,统计可行方案数。输入包含运动数量n、目标t、选择数量k及卡路里数组。采用DFS回溯算法,通过剪枝优化(提前终止无效分支),分别处理选择/不选当前运动的情况。当遍历完所有运动且满足条件时计数。示例输入"4 3 2"和"1 2 3"时,输出2(对应两种选择组合)。Java实现通过递归完成搜索,最终输出符合条件的方案总数。(149字)

u014481728的博客 285

STL通用工具--Pairs

Pairsclass pair 可以将两个值视为一个单元。对于map和multimap,就是用pairs来管理value/key的成对元素。任何函数需要回传两个值,也需要pair。pair结构定义在里面:namespace std {template struct pair {   // type names for the values   typedef T1 first_type; 

armman的专栏 3811

YOLO11涨点优化:注意力魔改 | 新颖的多尺度卷积注意力(MSCA),即插即用,助力小目标检测

多尺度卷积注意力(MSCA),有效地提取上下文信息,新颖度高,创新十足。

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 6316

智能指针_通用工具_STL

C++ STL提供的auto_ptr是一种智能型指针(smart pointer),帮助程序员抛出时发生

jinntaoo的专栏 440

地平线旭日X3 安装xfce桌面+VNC查看USB摄像头

VNC是Virtual Network Computing的缩写,它是一种使用RFB(Remote Frame Buffer)协议的用于控制远程电脑的图形桌面分享系统。xfce桌面相比于GNOME桌面更加轻量,占用的资源更少,在没有GPU的设备上也可以运行(旭日的Desktop版本从外观上好像就是xfce桌面,具体没有尝试)。可以使用专用的VNC客户端连接到开发板,例如vnc viewer。板子默认带有openssh-server,因此,WiFi热点连接成功后,就可以使用ssh登录开发板了。

bingdund的博客 509

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

STL_4: 通用工具

pairs 两个值视为一个单元 (key/value) pairs被定义为struct std::pair<int ,float> p;make_pairtemplate<class T1,clas T2> pair<T1,T2> make_pair(const T1& x,const T2& y) {return pair<T1,T2>(x,y);} ----- std::make_pair(42

LandscapeMi 397

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

辅助函数_通用工具__STL

定义域头文件,算法程序库中

jinntaoo的专栏 494

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

STL学习(二)

STL通用工具1、  Pairs(对组)常用的一个便捷函数namespace std{template typename T1,typename T2>pari make_pair(const T1& x,const T2& y){return pair(x,y);}}如:std::pairint,char>(42,’@’);óstd::make_pair(42,’@’); 2、  Class a

蓝天白云绿草 1227

STL文件格式简介及其转换方法

STL文件格式可以通过多种方式与其他格式进行转换,在选择转换方式时,用户应根据自己的需求和实际情况进行选择。

2403_89598061的博客 3344

STL学习笔记——目录

STL笔记目录001.STL简介002.C++11新特性003.C++98的经典语言特性004.温习一下C++的一些重要概念(上)005.温习一下C++的一些重要概念(下)006.通用工具——键值对(pair)和元组(tuple)007.通用工具——智能指针008.通用工具——数值的极值...

fifbro的博客 396

C++STL简介

STL(标准模板库)是C++编程中强大且高效的标准库,提供了通用的数据结构和算法。

m0_73803550的博客 903

STL格式3D模型在MATLAB中的显示工具:让3D模型显示更简单

STL格式3D模型在MATLAB中的显示工具:让3D模型显示更简单 去发现同类优质开源项目:https://gitcode.com/ 项目介绍 在现代工程和科研领域,三维模型的可视化变得越来越重要。STL(sterolithography)格式作为3D模型的一种通用格式,广泛应用于CAD、3D打印等领域。然而,在MATLAB中直接显示STL格式的3D模型并不直观。本项目即为解决这一问题而开发,提供...

gitblog_06731的博客 1024

58.C++ STL标准模板库 STL概述 STL三大组件

容器、算法、迭代器、仿函数、适配器(配接器)、空间配置器,每个组件解决了特定的编程问题。容器是用于存储和组织数据的数据结构。STL提供了多种容器,包括向量(vector)、链表(list)、双向链表(deque)、映射(map)、集合(set)等。容器的不同特点适用于不同的问题,例如,向量适合随机访问,链表适合插入和删除操作。算法是应用于容器的操作集合。STL提供了一系列通用的算法,如排序、查找、交换、合并等。这些算法适用于不同类型的容器,从而实现代码的重用。迭代器用于遍历容器中的元素。

weixin_63779802的博客 298

STL总体说明

初探C++ STL学习笔记1:总体说明   本学习笔记主要讲解C++ STL的基本知识与体系框架,主要适合初学者,对于理解STL的相信也有一定的参考借鉴价值,笔记中采用图文并茂的方式,希望对大家有所帮助,更好的理解STL。 讲解主线: 1:讲解STL中的通用工具,比如pair对组,auto_ptr智能指针。 2:讲解STL中的标准容器,vector list duque set map 等

K神丶的专栏 1130

没有模板代码膨胀的STL:三、开发者指南

总目录 一、设计目标与实现思路 二、使用方法与注意事项 三、开发者指南 四、一些讨论和个人心得 上一篇文章《使用方法与注意事项》描述了在项目中应用POD_STL的方法。本篇文章则是针对想要加入POD_STL开发工作的朋友的。当然,开发者也应当知晓项目的设计思路和使用需求。所以,想参与开发的朋友不光要阅读这篇文章,也应当仔细阅读两面两篇:《设计目标与实现思路》和《使用方法与注意事项》。

飞叶栖云 1028
上一篇: Shell 基本工作原理
下一篇: 精通Unix下C语言之文件系统结构
wolfzone025
博客等级 码龄16年 35粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值