c++中map与set的基本使用

news/2024/11/14 13:18:12/

c++中的map容器与set容器

map的所有函数方法及其用法

在C++中,std::map 是一个关联容器,它包含可以重复的键值对(实际上,std::map中的键是唯一的)。每个元素都有一个唯一的键和一个与之关联的值。std::map通常按照其键的升序对元素进行排序。

以下是一些std::map的常用成员函数及其用法:

  1. 构造函数和析构函数

    • map(): 默认构造函数,创建一个空的map
    • map(const map& other): 拷贝构造函数。
    • ~map(): 析构函数。
  2. 大小操作

    • size_type size() const noexcept: 返回map中元素的数量。
    • bool empty() const noexcept: 如果map为空,则返回true
  3. 元素访问

    • mapped_type& operator[](const key_type& key): 通过键访问元素(如果键不存在,则插入一个新元素)。
    • mapped_type& at(const key_type& key): 通过键访问元素(如果键不存在,则抛出std::out_of_range异常)。
    • mapped_type& at(const key_type& key) const: 类似上面的at,但返回常量引用。
    • iterator find(const key_type& key): 查找键为key的元素,如果找到则返回指向该元素的迭代器,否则返回end()
    • const_iterator find(const key_type& key) const: 同上,但返回常量迭代器。
  4. 插入和删除

    • pair<iterator,bool> insert(const value_type& val): 插入一个元素,如果键已存在则不插入。返回一个pair,其中迭代器指向插入的元素(或已存在的元素),布尔值表示是否插入了新元素。
    • iterator insert(const_iterator pos, const value_type& val): 在指定位置之前插入元素,但位置只是提示,不保证元素真的在那里插入。
    • iterator erase(const_iterator position): 删除指定位置的元素。
    • size_type erase(const key_type& key): 删除键为key的元素,并返回被删除的元素数量(0或1)。
    • iterator erase(const_iterator first, const_iterator last): 删除一个范围内的元素。
    • void clear() noexcept: 删除所有元素。
  5. 修改器

    • void swap(map& other) noexcept: 交换两个map的内容。
  6. 迭代器

    • iterator begin() noexcept: 返回指向第一个元素的迭代器。
    • const_iterator begin() const noexcept: 同上,但返回常量迭代器。
    • iterator end() noexcept: 返回指向容器“尾部之后”的迭代器。
    • const_iterator end() const noexcept: 同上,但返回常量迭代器。
    • reverse_iterator rbegin() noexcept: 返回指向最后一个元素的反向迭代器。
    • const_reverse_iterator rbegin() const noexcept: 同上,但返回常量反向迭代器。
    • reverse_iterator rend() noexcept: 返回指向“反向尾部之前”的反向迭代器。
    • const_reverse_iterator rend() const noexcept: 同上,但返回常量反向迭代器。
  7. 观察者

    • key_compare key_comp() const: 返回用于比较键的函数对象。
    • value_compare value_comp() const: 返回用于比较值的函数对象(实际上它使用键比较)。

这只是std::map的一些常用成员函数。要了解更多详细信息,建议查阅C++标准库文档或相关书籍。

set的所有函数方法及其用法


在C++中,std::set是一个关联容器,它包含唯一元素。与std::map类似,std::set的元素在插入时自动按键(在这种情况下,键和值相同)的升序排序。但是,与std::map不同,std::set仅存储键,并不与任何关联的值一起存储。

以下是一些std::set的常用成员函数及其用法:

  1. 构造函数和析构函数

    • set(): 默认构造函数,创建一个空的set
    • set(const set& other): 拷贝构造函数。
    • ~set(): 析构函数。
  2. 大小操作

    • size_type size() const noexcept: 返回set中元素的数量。
    • bool empty() const noexcept: 如果set为空,则返回true
  3. 元素访问

    • 由于set不存储值,因此没有直接访问元素值的函数。但是,你可以通过迭代器来遍历set中的所有元素。
  4. 插入和删除

    • pair<iterator,bool> insert(const value_type& val): 尝试插入一个元素。如果元素已存在,则插入失败,并返回表示该元素已经存在的pair(迭代器指向已存在的元素,bool值为false)。如果元素不存在,则插入新元素,并返回表示插入成功的pair(迭代器指向新插入的元素,bool值为true)。
    • iterator insert(const_iterator pos, const value_type& val): 在指定位置之前尝试插入元素。但是请注意,由于set中的元素是有序的,因此这个位置只是一个提示,实际插入位置可能会不同。
    • iterator erase(const_iterator position): 删除指定位置的元素。
    • size_type erase(const key_type& key): 删除键为key的元素(如果存在),并返回被删除的元素数量(0或1)。
    • iterator erase(const_iterator first, const_iterator last): 删除一个范围内的元素。
    • void clear() noexcept: 删除所有元素。
  5. 查找

    • iterator find(const key_type& key): 查找键为key的元素。如果找到,则返回指向该元素的迭代器;否则返回end()
    • const_iterator find(const key_type& key) const: 同上,但返回常量迭代器。
    • size_type count(const key_type& key) const noexcept: 返回键为key的元素的数量(对于set,这总是0或1)。
    • iterator lower_bound(const key_type& key): 返回指向第一个不小于(即大于或等于)key的元素的迭代器。
    • iterator upper_bound(const key_type& key): 返回指向第一个大于key的元素的迭代器。
    • pair<iterator,iterator> equal_range(const key_type& key): 返回一个范围,其中包含所有键等于key的元素。对于set,这个范围可能只包含一个元素或为空。
  6. 迭代器

    • std::map类似,std::set也提供了一系列相似的迭代器函数来遍历容器中的元素。
  7. 观察者

    • key_compare key_comp() const: 返回用于比较键的函数对象。

这只是std::set的一些常用成员函数。要了解更多详细信息,建议查阅C++标准库文档或相关书籍。

拓展

使用 set 可以获取容器中的最大最小值:

set<int> s;//第一个数值(最小值)的函数为*s.begin();
cout<<"s的最小值:"<<*s.begin()<<endl;//最后一个数值(最大值)的函数为*s.rbegin();
cout<<"s的最大值为:"<<*s.rbegin()<<endl;
//或者是
cout<<"s的最大值为:"<<*(--s.end())<<endl;
//注意不能是s.end() ,因为s.end()指向的是容器“尾部之后”的迭代器

http://www.ppmy.cn/news/1453390.html

相关文章

C++成员初始化列表

我们在类的构造函数中使用成员初始化列表可以带来效率上的提升&#xff0c;那么成员初始化列表在编译后会发生什么就是这篇文章要探究的问题 文章目录 引入成员初始化列表用成员初始化列表优化上面的代码成员初始化列表展开成员初始化列表的潜在危险 参考资料 引入 考虑下面这…

HTML_CSS学习:CSS盒子模型

一、CSS中常用的长度单位 相关代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>CSS中常用的长度单位</title><style>html{font-size: 40px;}#d1{/*第一种长度单位&…

【微服务 开发】微服务介绍,服务拆分,远程调用

微服务 微服务SpringCloud 拆分如何拆分 远程调用 微服务 微服务是一种软件架构风格&#xff0c;它是以专注于单一职责的很多小型项目为基础&#xff0c;组合成复杂的大型应用 单体架构 将业务的所有功能集中在一个项目中进行开发&#xff0c;打成一个包部署 微服务的特征&…

python制作可执行文件(cython)

使用Cython将Python脚本编译成可执行文件涉及几个步骤。以下是一个基本的指南&#xff1a; 1. 安装Cython 首先&#xff0c;你需要安装Cython。你可以使用pip来安装&#xff1a; pip install cython 2. 编写Cython文件 通常&#xff0c;Cython源文件的后缀是.pyx。你可以将…

Containerd方式部署K8s集群

1.1 Kubernetes基础环境部署 kubernetes有多种部署方式&#xff0c;目前主流的方式有kubeadm、minikube、二进制包 minikube&#xff1a;一个用于快速搭建单节点kubernetes的工具 kubeadm&#xff1a;一个用于快速搭建kubernetes集群的工具 二进制包 &#xff1a;从官网下载…

yarn -v在vscode中报错

前言&#xff1a;积累小知识 1、问题描述 yarn属于类似于npm的安装工具&#xff0c;成功用npm install --global yarn 之后 在cmd终端可以查询yarn的版本号&#xff0c;但是在vscode的终端里却会报错&#xff0c;如下图&#xff1a; 2、解决 分析原因&#xff1a;VSCode的终…

【C++并发编程】(三)互斥锁:std::mutex

文章目录 互斥锁数据竞争C互斥锁lock() 和 unlock()std::lock_guard 互斥锁 数据竞争 在并发编程中&#xff0c;数据竞争是指多个线程同时对共享数据进行读写操作&#xff0c;并且至少有一个线程进行写操作&#xff0c;从而导致未定义的行为或结果。 下面给出一个例子&#x…

Java面试——不安全的集合类

​ 系统性学习&#xff0c;移步IT-BLOG-CN Java 中有许多的集合&#xff0c;常用的有List&#xff0c;Set&#xff0c;Queue&#xff0c;Map。 其中 List&#xff0c;Set&#xff0c;Queue都是Collection&#xff08;集合&#xff09;&#xff0c;List中<>的内容表示其中…