“造地基”的C++ (十一) 泛型程序设计与C++标准库模板

本文介绍了泛型程序设计的基本概念及其在C++中的应用,重点讲解了标准模板库(STL)的主要组件,包括容器、迭代器、函数对象及算法等,并详细阐述了各组件的特点和使用方法。
  • 泛型程序设计的基本概念
    1. 泛型程序设计
      1. 编写不依赖于具体数据类型的数据
      2. 将算法从特定的数据结构中抽象出来,成为通用的
      3. C++的模板为泛型程序设计奠定了关键的基础
    2. 概念
      1. 用来界定具备一定功能的数据类型
      2. 对于两个不同的概念A和B,如果概念A所需求的所有功能也是概念B所需求的功能,那么就说概念A是概念B的子概念
    3. 模型:符合一个概念的数据类型称为该概念的模型
  1. 用概念做模板参数名:很多STL的实现代码就是使用概念来命名模板参数的

 

  • STL简介
    1. 标准模板库(Standard Template Library,简称STL)定义了一套概念体系,为泛型程序设计提供了逻辑基础
    2. STL中的各个类模板、函数模板的参数都是用这个体系中的概念来规定的
    3. 使用STL的模板时,类型参数可以是C++标准库中已有的类型,也可以是自定义的类型,只要这些类型是所要求概念的模型

 

  • STL的基本组件
    1. 容器(container)
    2. 迭代器(iterator):是算法和容器的桥梁,将迭代器作为算法的参数、通过迭代器来访问容器而不是把容器直接作为算法的参数。
    3. 函数对象(function object):将函数对象作为算法的参数而不是将函数所执行的运算作为算法的一部分。
    4. 算法(algorithms)

 

  • 容器
    1. 容纳、包含一组元素的对象
    2. 基本容器类模板
      1. 顺序容器:array(数组)、vector(向量)、deque(双端队列)、forward-list(单链表)、list(链表)
      2. (有序)关联容器:set(集合)、multiset(双重集合)、map(映射)、multimap(多重映射)
      3. 无序关联容器:unodered_set(无序集合)、unodered_multiset(无序多重集合)、unodered_map(无序映射)、unodered_multimap(无序多重映射)
    3. 容器适配器
      1. Stack(栈)
      2. Queue(队列)
      3. Priority-queue(优先队列)

 

  • 迭代器
    1. 提供了顺序访问容器中每个元素的方法
    2. 可以使用“++”运算符来获得指向下一个元素的迭代器
    3. 可以使用“*”运算符来访问迭代器所指向的元素,如果元素类型是类或结构体,还可以通过“—>”来直接访问钙元素的一个成员
    4. 有些迭代器还支持通过“——”运算符获得上一个元素的迭代器
    5. 迭代器是泛化的指针,指针也具有同样的特性,因此指针本身就是一种迭代器
    6. 使用独立于STL容器的迭代器,需要包含头文件<iterator>
    7. 算法不直接操作容器中的数据,而是通过迭代器间接操作
    8. 算法和容器独立
      1. 增加新的算法,无需影响容器的实现
      2. 增加新的容器,全有的算法也能适用

 

  • 函数对象
    1. 一个行为类似函数的对象,对他可以像调用函数一样调用
    2. 函数对象是泛化的函数,任何普通的函数和任何重载了“()”运算符的类的对象都可以作为函数对象使用
    3. 使用STL的函数对象,需要包含头文件<functional>

 

  • 迭代器支持的操作
    1. 迭代器是泛化的指针,提供了类似指针的操作(“++”、“*”、“—>”)
    2. 输入迭代器:可以用来从序列中读取数据,如输入流迭代器
    3. 输出迭代器:允许向序列中写入数据,如输出流迭代器
    4. 前向迭代器:既是输出迭代器又是输入迭代器,并且可以对序列进行单向的遍历
    5. 双向迭代器:与前向迭代器相似,但是在两个方向上都可以对数据遍历
    6. 随机访问迭代器:也是双向迭代器,但能够在序列中的任意两个位置之间进行跳转,如:使用vector的begin()、end()函数得到的迭代器

 

  • 迭代器的区间
    1. 两个迭代器表示一个区间:[p1,p2)
    2. STL算法常以迭代器的区间作为输入,传入数据
    3. 合法的区间:p1经过n次(n>0)自增(++)操作后满足p1 ==p2
    4. 区间包含p1,但不包含p2

 

  • 向量
    1. 特点
      1. 一个可以扩展的动态数组
      2. 随机访问,在尾部插入或删除元素快
      3. 在中间或头部插入或删除元素慢
    2. 向量的容量
      1. 容量(capacity):实际分配空间的大小
      2. S.capacity():返回当前容量
      3. S.reserve():若容量小于n,则对s进行扩展,使容量至少为n

 

  • 双端队列
  1. 在两端插入或删除元素快
  2. 在中间插入或删除元素慢
  3. 随机访问比较快,但比向量容器慢

 

  • 列表
    1. 特点
      1. 在任意位置插入和删除元素都很快
      2. 不支持随机访问
    2. 接合(splice)操作:s1.splice(p,s2,q1,q2):将s2中的[q1,q2)移动到s1中p所指向元素之前

 

  • 单向链表(forward-list)
    1. 单项链表每个结点只有指向下个结点的指针,没有简单的方法来获取一个结点的前驱
    2. 未定义insert、emplace和erase操作,而定义了insert-after、emplace-after和erase-after操作,其参数与list的insert、emplace和erase相同,但并不是插入或删除迭代器p1所指的元素,而是对p1所指的元素之后的结点进行操作
    3. 不支持size操作

 

  • 顺序容器的插入迭代器
    1. 用于向容器头部、尾部或中间指定位置插入元素的迭代器
    2. 包括前插迭代器(front_inserter)、后插迭代器(back_inserter)和任意位置插入迭代器(inserter)
    3. 例:  list<int> s;   back_inserter iter(s);   *(iter++) = 5;  //通过iter把5插入s末尾

 

  • 集合(set):集合用来存储一组无重复的元素,由于集合的元素本身是有序的,可以高效的查找指定元素,也可以方便的得到指定大小范围的元素在容器中所处的空间

 

  • 映射(map)
    1. 映射和集合同属于单重关联容器,他们主要的区别在于,集合的元素类型是键本身,而映射的元素类型是由键和附加数据所构成的二元组
    2. 在集合中按照键查找一个元素时,一般只是用来确定这个元素是否存在,而在映射中按照键查找一个元素时,除了能确定他的存在性之外,还可以得到相应的附加数据

 

  • 多重集合和多重映射
    1. 多重集合是允许有重复元素的集合,多重映射是允许一个键对应多个附加数据的映射
    2. 多重集合与集合、多重映射与映射的用法差不多

 

 

 

 

06-22
### 得物技术栈及开发者文档分析 得物作为一家专注于潮流商品的电商平台,其技术栈和开发者文档主要围绕电商平台的核心需求展开。以下是对得物技术栈及相关开发资源的详细解析: #### 1. 技术栈概述 得物的技术栈通常会涵盖前端、后端、移动应用开发以及大数据处理等多个领域。以下是可能涉及的主要技术栈[^3]: - **前端开发**: 前端技术栈可能包括现代框架如 React 或 Vue.js,用于构建高效、响应式的用户界面。此外,还会使用 Webpack 等工具进行模块化打包和优化。 - **后端开发**: 后端技术栈可能采用 Java Spring Boot 或 Node.js,以支持高并发和分布式架构。数据库方面,MySQL 和 Redis 是常见的选择,分别用于关系型数据存储和缓存管理。 - **移动应用开发**: 得物的移动应用开发可能基于原生技术(如 Swift/Kotlin)或跨平台框架(如 Flutter)。这有助于确保移动端应用的性能和用户体验一致性。 - **大数据云计算**: 在大数据处理方面,得物可能会使用 Hadoop 或 Spark 进行数据挖掘和分析。同时,依托云服务提供商(如阿里云或腾讯云),实现弹性扩展和资源优化。 #### 2. 开发者文档分析 类似于引用中提到的 Adobe 开发者文档模板[^2],得物也可能提供一套完整的开发者文档体系,以支持内部团队协作和外部开发者接入。以下是开发者文档可能包含的内容: - **API 文档**: 提供 RESTful API 或 GraphQL 的详细说明,帮助开发者快速集成得物的功能模块,例如商品搜索、订单管理等。 - **SDK 集成指南**: 针对不同平台(如 iOS、Android 或 Web)提供 SDK 下载和集成教程,简化第三方应用的开发流程。 - **技术博客**: 分享得物在技术实践中的经验成果,例如如何优化图片加载速度、提升应用性能等。 - **开源项目**: 得物可能将部分技术成果开源,供社区开发者学习和贡献。这不仅有助于提升品牌形象,还能吸引更多优秀人才加入。 #### 3. 示例代码 以下是一个简单的示例代码,展示如何通过 RESTful API 调用得物的商品搜索功能(假设接口已存在): ```python import requests def search_items(keyword, page=1): url = "https://api.dewu.com/v1/items/search" headers = { "Authorization": "Bearer YOUR_ACCESS_TOKEN", "Content-Type": "application/json" } params = { "keyword": keyword, "page": page, "size": 10 } response = requests.get(url, headers=headers, params=params) if response.status_code == 200: return response.json() else: return {"error": "Failed to fetch data"} # 调用示例 result = search_items("Air Jordan", page=1) print(result) ``` 此代码片段展示了如何通过 Python 请求得物的 API,并获取指定关键词的商品列表。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值