当前位置: 首页 > news >正文

C++ 标准库容器常用成员函数

C++ 标准库提供了多种容器类型,每种容器都有一系列成员函数。以下是主要容器(vectorarraylistdequeforward_listsetmap等)的常用成员函数分类说明:

一、所有容器共有的成员函数

1. 容量相关

  • empty() - 检查容器是否为空

  • size() - 返回元素数量(forward_list没有)

  • max_size() - 返回容器可能包含的最大元素数

2. 迭代器相关

  • begin()/end() - 返回指向开头/结尾的迭代器

  • cbegin()/cend() - 返回const迭代器(C++11)

  • rbegin()/rend() - 返回反向迭代器

  • crbegin()/crend() - 返回const反向迭代器(C++11)

二、序列容器特有函数(vector, array, list, deque, forward_list)

1. 元素访问

  • operator[] - 访问指定位置元素(listforward_list没有)

  • at() - 带边界检查的访问(listforward_list没有)

  • front() - 访问第一个元素

  • back() - 访问最后一个元素(forward_list没有)

2. 修改操作

  • push_back() - 末尾添加元素(arrayforward_list没有)

  • pop_back() - 移除末尾元素(arrayforward_list没有)

  • insert() - 在指定位置插入元素

  • erase() - 删除指定位置元素

  • clear() - 清空容器

3. 特殊操作

  • assign() - 替换容器内容

  • resize() - 改变容器大小

  • swap() - 交换两个容器内容

三、链表特有函数(list, forward_list)

  • push_front()/pop_front() - 在头部添加/删除元素

  • merge() - 合并两个已排序链表

  • splice() - 从另一个链表移动元素

  • remove()/remove_if() - 删除满足条件的元素

  • reverse() - 反转链表顺序

  • sort() - 对链表进行排序

  • unique() - 删除连续重复元素

四、关联容器特有函数(set, map, multiset, multimap)

1. 查找操作

  • find() - 查找指定键

  • count() - 统计键出现的次数

  • lower_bound()/upper_bound() - 返回键的边界

  • equal_range() - 返回匹配键的范围

2. 修改操作

  • insert() - 插入元素

  • emplace() - 原位构造插入(C++11)

  • erase() - 删除元素

  • extract() - 提取节点(C++17)

  • merge() - 合并容器(C++17)

五、无序容器特有函数(unordered_set, unordered_map等)

  • bucket_count() - 返回桶数

  • bucket() - 返回键所在的桶

  • load_factor() - 返回负载因子

  • rehash() - 设置桶数

  • reserve() - 预留空间

六、容器适配器特有函数(stack, queue, priority_queue)

  • push() - 插入元素

  • pop() - 删除顶部/前端元素

  • top() - 访问顶部元素(stack/priority_queue)

  • front() - 访问前端元素(queue)

使用示例

// vector示例
std::vector<int> v = {1, 2, 3};
v.push_back(4);
int val = v.at(2);// list示例
std::list<int> lst = {1, 2, 3};
lst.push_front(0);
lst.sort();// map示例
std::map<std::string, int> m;
m["apple"] = 5;
auto it = m.find("apple");// unordered_set示例
std::unordered_set<int> s = {1, 2, 3};
s.insert(4);
size_t buckets = s.bucket_count();

性能考虑

  1. vector:随机访问快,尾部操作快,中间插入/删除慢

  2. list:插入/删除快,随机访问慢

  3. deque:头尾操作快,中间操作慢

  4. set/map:查找快,保持有序

  5. unordered_set/unordered_map:平均查找最快,但不保持顺序

选择容器时应根据具体的使用场景和性能需求来决定。

C++ 中的 rbegin() 和 end() 方法详解

rbegin() 和 end() 是 C++ 标准库容器中用于控制元素访问范围的重要成员函数,它们分别代表了反向迭代的起点和正向迭代的终点。

rbegin() 方法

基本特性

  • 功能:返回指向容器最后一个元素的反向迭代器

  • 适用容器:所有支持双向迭代的容器(vector, deque, list, set, map等)

使用方式

std::vector<int> v = {1, 2, 3, 4};
auto rit = v.rbegin();  // 指向4的反向迭代器

主要特点

  1. 与 rend() 配对使用,构成反向迭代范围

  2. 解引用后可直接访问元素值

  3. 递增操作(++)会向容器前端移动

  4. 空容器时 rbegin() == rend()

应用示例

// 反向遍历vector
std::vector<int> v = {1, 2, 3, 4};
for (auto rit = v.rbegin(); rit != v.rend(); ++rit) {std::cout << *rit << " ";  // 输出: 4 3 2 1
}// 修改最后一个元素
if (!v.empty()) {*v.rbegin() = 10;  // 将4改为10
}

end() 方法

基本特性

  • 功能:返回指向容器"尾后"位置的正向迭代器

  • 适用容器:所有标准容器

使用方式

std::vector<int> v = {1, 2, 3};
auto it = v.end();  // 指向3之后的位置

主要特点

  1. 与 begin() 配对使用,构成正向迭代范围

  2. 不解引用(解引用是未定义行为)

  3. 空容器时 begin() == end()

  4. 常用于循环终止条件和算法参数

rbegin() 和 end() 的关键区别

特性rbegin()end()
迭代方向反向(从尾到头)正向(从头到尾)
指向位置最后一个元素最后一个元素的下一个位置
解引用可以解引用访问元素不可解引用
典型用途反向遍历、访问尾部元素循环终止、范围界定
空容器rbegin() == rend()begin() == end()

应用示例

// 正向遍历vector
for (auto it = v.begin(); it != v.end(); ++it) {std::cout << *it << " ";  // 输出: 1 2 3
}// 配合算法使用
auto found = std::find(v.begin(), v.end(), 2);
if (found != v.end()) {// 找到了元素2
}

获取最后一个元素的三种方式:

// 方法1(推荐)
int last1 = vec.back();// 方法2
int last2 = *vec.rbegin();// 方法3(不推荐)
int last3 = *(vec.end() - 1);

使用反向迭代器实现降序排序

std::vector<int> vec = {3, 1, 4, 1, 5, 9, 2, 6};// 先升序排序,然后反转
std::sort(vec.begin(), vec.end()); // 升序
std::reverse(vec.begin(), vec.end()); // 反转得到降序// 或者一步完成
std::sort(vec.rbegin(), vec.rend()); // 使用反向迭代器

http://www.dtcms.com/a/321781.html

相关文章:

  • 04--模板初阶(了解)
  • 【Linux】从零开始:RPM 打包全流程实战万字指南(含目录结构、spec 编写、分步调试)
  • 【探展WAIC】从“眼见为虚”到“AI识真”:如何用大模型筑造多模态鉴伪盾牌
  • 惯量时间常数 H 与转动惯量 J 的关系解析
  • uniapp开发微信小程序遇到富文本内容大小变形问题v-html
  • 【谷歌 SEO】排查页面未索引问题:原因与解决方案
  • 页面tkinter
  • CALL与 RET指令及C#抽象函数和虚函数执行过程解析
  • 锂电池保护板测试仪:守护电池安全的核心工具|深圳鑫达能
  • 深度学习里一些常用的指标(备份)
  • 常见数据结构介绍(顺序表,单链表,双链表,单向循环链表,双向循环链表、内核链表、栈、队列、二叉树)
  • 浅析线程池工具类Executors
  • 客户端攻击防御:详解现代浏览器安全措施
  • Python字典高阶操作:高效提取子集的技术与工程实践
  • Socket编程预习
  • js 实现洋葱模型、洋葱反向模型
  • 关于 Rust 异步(无栈协程)的相关疑问
  • Prometheus 监控平台部署与应用
  • 新版速递|ColchisFM突破传统建模局限,用地质统计学模拟构建更真实的地震正演模型
  • 1635. 预算够吗
  • linux运维命令查看cpu、内存、磁盘使用情况
  • FFmpeg 编译安装和静态安装
  • 12、GPIO介绍
  • Redis7集群搭建与原理分析
  • element plus table 表格操作列根据按钮数量自适应宽度
  • 从引导加载程序到sysfs:Linux设备树的完整解析与驱动绑定机制
  • 您与此网站之间建立的连接不安全
  • 智慧园区漏检率↓82%:陌讯多模态融合算法实战解析
  • 防御保护09
  • 【从0到1制作一块STM32开发板】6. PCB布线--信号部分