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

C++ 常见容器获取头元素的方法全览

在C++编程中,容器是存储和管理数据集合的重要工具。不同的容器提供了不同的接口来访问和操作其中的元素。获取容器的头元素(即第一个元素)是常见的操作之一。本文将详细列举C++标准库中所有常见容器获取头元素的方法,并对每种方法进行简要说明。

一、std::vector

std::vector是一个动态数组,它允许快速随机访问元素。要获取std::vector的头元素,可以使用索引或迭代器。

通过索引访问

std::vector<int> vec = {1, 2, 3, 4, 5};
int head = vec[0]; // 获取头元素,即第一个元素

通过迭代器访问

std::vector<int> vec = {1, 2, 3, 4, 5};
int head = *vec.begin(); // 获取头元素,begin() 返回指向第一个元素的迭代器
二、std::list

std::list是一个双向链表,它允许在容器的任意位置进行高效的插入和删除操作。要获取std::list的头元素,只能使用迭代器。

通过迭代器访问

std::list<int> lst = {1, 2, 3, 4, 5};
int head = *lst.begin(); // 获取头元素,begin() 返回指向第一个元素的迭代器

std::list不支持通过索引访问元素,因为链表的内存布局不是连续的。

三、std::deque

std::deque是一个双端队列,它允许在容器的两端进行高效的插入和删除操作。与std::vector类似,std::deque也支持通过索引和迭代器访问元素。

通过索引访问(仅在支持随机访问的编译器实现中可用,但标准并未强制要求):

std::deque<int> deq = {1, 2, 3, 4, 5};
int head = deq[0]; // 获取头元素,注意这并非标准强制的行为

通过迭代器访问(推荐方式):

std::deque<int> deq = {1, 2, 3, 4, 5};
int head = *deq.begin(); // 获取头元素,begin() 返回指向第一个元素的迭代器
四、std::forward_list

std::forward_list是一个单向链表,它只允许单向遍历。要获取std::forward_list的头元素,同样只能使用迭代器。

通过迭代器访问

std::forward_list<int> flst = {1, 2, 3, 4, 5};
int head = *flst.before_begin().next(); // 获取头元素,before_begin() 返回指向第一个元素之前的迭代器,然后调用 next()

注意,std::forward_list的迭代器是单向的,且不支持--操作符,因此访问头元素稍微有些特殊。

五、std::setstd::multiset

std::setstd::multiset是基于红黑树的有序集合。它们不允许重复元素(multiset允许重复键但值仍需唯一)。要获取这些容器的头元素,可以使用迭代器。

通过迭代器访问

std::set<int> s = {1, 2, 3, 4, 5};
int head = *s.begin(); // 获取头元素,即最小的元素

对于std::multiset,操作是相同的。

六、std::mapstd::multimap

std::mapstd::multimap是基于红黑树的关联容器,它们存储键值对。要获取这些容器的头元素的键或值,可以使用迭代器。

通过迭代器访问键

std::map<int, std::string> m = {{1, "one"}, {2, "two"}, {3, "three"}};
int head_key = m.begin()->first; // 获取头元素的键

通过迭代器访问值

std::string head_value = m.begin()->second; // 获取头元素的值

对于std::multimap,操作是相同的,但请注意,由于multimap允许重复键,因此头元素可能不是唯一的。

七、std::unordered_setstd::unordered_multiset

std::unordered_setstd::unordered_multiset是基于哈希表的无序集合。它们同样不允许重复元素(unordered_multiset允许重复元素)。要获取这些容器的头元素,可以使用迭代器。

通过迭代器访问

std::unordered_set<int> us = {1, 2, 3, 4, 5};
int head = *us.begin(); // 获取头元素,但不一定是插入顺序的第一个元素

对于std::unordered_multiset,操作是相同的。

八、std::unordered_mapstd::unordered_multimap

std::unordered_mapstd::unordered_multimap是基于哈希表的无序关联容器。它们存储键值对。要获取这些容器的头元素的键或值,可以使用迭代器。

通过迭代器访问键

std::unordered_map<int, std::string> um = {{1, "one"}, {2, "two"}, {3, "three"}};
int head_key = um.begin()->first; // 获取头元素的键

通过迭代器访问值

std::string head_value = um.begin()->second; // 获取头元素的值

对于std::unordered_multimap,操作是相同的,但同样请注意,由于unordered_multimap允许重复键,因此头元素可能不是唯一的。

九、std::stack

std::stack是一个适配器,它基于其他容器(如std::dequestd::vector)实现栈的功能。要获取std::stack的头元素(即栈顶元素),可以使用top()方法。

通过top()方法访问

std::stack<int> stk = {1, 2, 3, 4, 5};
int head = stk.top(); // 获取头元素,即栈顶元素
十、std::queue

std::queue也是一个适配器,它基于其他容器(如std::deque)实现队列的功能。要获取std::queue的头元素(即队首元素),可以使用front()方法。

通过front()方法访问

std::queue<int> q = {1, 2, 3, 4, 5};
int head = q.front(); // 获取头元素,即队首元素

std::queue没有top()方法,这是std::stack特有的。

十一、std::priority_queue

std::priority_queue是一个适配器,它基于其他容器(如std::vector)实现优先队列的功能。要获取std::priority_queue的头元素(即具有最高优先级的元素),可以使用top()方法。

通过top()方法访问

std::priority_queue<int> pq = {1, 2, 3, 4, 5};
int head = pq.top(); // 获取头元素,即具有最高优先级的元素
总结

在C++标准库中,不同的容器提供了不同的接口来访问它们的头元素。对于序列容器(如std::vectorstd::liststd::deque等),通常使用索引或迭代器来访问头元素。对于关联容器(如std::setstd::map等)和无序关联容器(如std::unordered_setstd::unordered_map等),则使用迭代器来访问头元素。对于栈(std::stack)和优先队列(std::priority_queue),使用top()方法来获取头元素。而对于队列(std::queue),则使用front()方法来获取头元素。

了解这些容器如何访问头元素是掌握C++标准库的重要一步,它将帮助你更有效地编写和调试C++程序。


http://www.kler.cn/a/400316.html

相关文章:

  • 机器学习基础04
  • 基于 MONAI 的 3D 图像分割任务2(Brain Tumour 和 SwinUNETR 训练)
  • 递归(3)----力扣40组合数2,力扣473火柴拼正方形
  • 4.STM32之通信接口《精讲》之USART通信---实验串口发送程序
  • [Qt platform plugin问题] Could not load the Qt platform plugin “xcb“
  • std::sort的底层原理(混合排序算法)
  • 数据结构-二叉搜索树(Java语言)
  • 2.3 物理层设备
  • 无人机+无人车+机器狗:城市巷战突破技术详解
  • DataStream编程模型之数据源、数据转换、数据输出
  • 【蓝桥杯备赛】深秋的苹果
  • @quick-start/electron安装过程中的问题解决
  • CertiK安全调研报告:Web3.0桌面钱包的初步安全评估
  • vscode调试已经编译好的程序
  • ROS第九梯:ROS+VSCode+Python+C++自定义消息发布和订阅
  • ⚡️如何在 React 和 Next.js 项目里优雅的使用 Zustand
  • DAY30|贪心算法Part04|LeetCode:452. 用最少数量的箭引爆气球、435. 无重叠区间、763.划分字母区间
  • 【C++】用哈希表封装unordered_map和unordered_set
  • uni-app快速入门(十一)--常用JS API(上)
  • 全志科技嵌入式面试题及参考答案
  • 【论文阅读】Large Language Models for Equivalent Mutant Detection: How Far Are We?
  • vue3 + vite + ts 配置 @ 别名
  • python成长技能之正则表达式
  • python模块和包
  • 【漏洞复现】某全新H5购物商城系统存在前台任意文件上传漏洞(RCE)
  • 枚举Enum使用