数据结构Map&&Multimap篇

本文详细介绍了C++中的map和multimap容器,包括它们的基本概念、构造函数、赋值操作、大小操作、插入和删除元素、查找功能以及使用示例,展示了如何创建、初始化和操作这两种常用的数据结构。
摘要由CSDN通过智能技术生成

防丢

原文链接:https://blog.csdn.net/Long_xu/article/details/135572497

防丢

原文链接:https://blog.csdn.net/Long_xu/article/details/135572497

一、介绍


在C++中,map和multimap容器是非常重要的数据结构,它们提供了一种键值对的映射关系,可以高效地组织和访问数据。map容器中的每个元素都包含一个键和一个值,而multimap容器允许键重复。

二、map和multimap容器的基本概念


map的特性
  •         所有元素都会根据元素的键值自动排序。
  •         map所有的元素都是pair,同时拥有实值和键值。
  •         map 不允许两个元素有相同的键值。
  •         不能改变map的键值,因为 map的键值关系到 map元素的排列规则,任意改变map键值将会严重破坏map数据组织。
  •         如果想要修改元素的实值,那么是可以的。

三、map和multimap容器的基本操作(常用的接口函数API)


(1)构造函数:

// 默认构造
map<Key, T> m;		//默认构造一个空的map,键的类型为Key,值的类型为T。
multimap<Key, T> mm;//默认构造一个空的multimap,键的类型为Key,值的类型为T。

// 带有比较函数参数的构造函数:
map< Key, T, Compare> m (const Compare& comp);		//通过指定比较函数comp来构造map。
multimap< Key, T, Compare> mm (const Compare& comp);//通过指定比较函数comp来构造multimap。

// 区间构造函数:
map< Key, T> m (InputIterator first, InputIterator last);		//使用迭代器范围[first, last)内的元素来构造map。
multimap< Key, T> mm (InputIterator first, InputIterator last)	//使用迭代器范围[first, last)内的元素来构造multimap。

//拷贝构造函数:
map< Key, T> m (const map& x);				//拷贝构造一个map,其元素和x相同。
multimap< Key, T> mm (const multimap& x);	//拷贝构造一个multimap,其元素和x相同。

//移动构造函数(C++11引入):
map< Key, T> m (map&& x);			//移动构造一个map,取得x的资源但留下x为空。
multimap< Key, T> mm (multimap&& x);//移动构造一个multimap,取得x的资源但留下x为空。


(2)赋值操作:

// 赋值运算符:
map& operator=(const map& x);			//赋值运算符重载,用x的内容替换当前map的内容。
multimap& operator=(const multimap& x);	//赋值运算符重载,用x的内容替换当前multimap的内容。
// swap函数:
void swap(map& x);		//交换当前map和map x的内容。
void swap(multimap& x);	//交换当前multimap和multimap x的内容。


(3)大小操作:

// size函数:
size_type size() const;	//返回map或multimap中元素的个数。
// empty函数:
bool empty() const;		//如果map或multimap为空,则返回true,否则返回false。


(4)插入数据元素操作:

// insert函数:
pair<iterator, bool> insert(const value_type& val);			//在map中插入val,返回一个pair,第一个元素是一个迭代器,指向新插入的元素或者已存在的相同键的元素,第二个元素是一个bool值,表示插入是否成功。
iterator insert(iterator position, const value_type& val);	//在position位置插入val,并返回插入元素的迭代器。

// emplace函数:使用传入的参数构造元素并插入map中,返回一个pair,
// 第一个元素是一个迭代器,指向新插入的元素或者已存在的相同键的元素,第二个元素是一个bool值,表示插入是否成功。
template <class... Args> pair<iterator, bool> emplace(Args&&... args);

// insert_or_assign函数(C++17及以上版本):如果k存在,则将其关联的值替换为obj,如果不存在则创建一个新的键值对,并返回一个pair,
// 第一个元素是一个迭代器,指向新插入或修改的元素,第二个元素是一个bool值,表示是插入还是修改操作。
- template <class M> pair<iterator, bool> insert_or_assign(const key_type& k, M&& obj);


(5)删除操作:

// erase函数:
iterator erase(iterator position);				//删除指向位置position的元素,并返回指向被删元素之后的下一个元素的迭代器。
size_type erase(const key_type& k);				//删除所有键为k的元素,并返回被删除的元素的数量。
iterator erase(iterator first, iterator last);	//删除[first, last)范围内的所有元素,并返回指向被删元素之后的下一个元素的迭代器。

// clear函数:删除map或multimap中的所有元素。
void clear();



(6)查找操作:

// find函数:
iterator find(const key_type& k);				//查找键为k的元素,并返回指向该元素的迭代器,如果未找到则返回指向尾部的迭代器。
const_iterator find(const key_type& k) const;	//在const map或multimap中查找键为k的元素,并返回指向该元素的const迭代器。

// count函数:返回map或multimap中键等于k的元素的个数。
size_type count(const key_type& k) const;

// lower_bound函数:返回一个迭代器,指向第一个不小于k的元素。
iterator lower_bound(const key_type& k);

// upper_bound函数:返回一个迭代器,指向第一个大于k的元素。
iterator upper_bound(const key_type& k);

// equal_range函数:返回一个pair,包含两个迭代器,第一个迭代器指向键值等于k的第一个元素,第二个迭代器指向键值大于k的第一个元素。
pair<iterator, iterator> equal_range(const key_type& k);


(7)访问元素:

  • operator[]:通过键访问对应的值。
  • at(key):通过键访问对应的值,如果不存在会抛出out_of_range异常。
  • find(key):查找键为key的元素,返回指向该元素的迭代器。

四、使用示例

(1)创建和初始化map和multimap容器:

#include <iostream>
#include <map>
#include <unordered_map>

int main() {
    // 创建并初始化map容器
    std::map<int, std::string> myMap = {
        {1, "One"},
        {2, "Two"},
        {3, "Three"}
    };

    // 创建并初始化multimap容器
    std::multimap<int, std::string> myMultimap = {
        {1, "Apple"},
        {2, "Banana"},
        {2, "Orange"}
    };

    // 输出map容器内容
    for (const auto& pair : myMap) {
        std::cout << pair.first << ": " << pair.second << std::endl;
    }

    // 输出multimap容器内容
    for (const auto& pair : myMultimap) {
        std::cout << pair.first << ": " << pair.second << std::endl;
    }

    return 0;
}


(2)插入和删除元素:

#include <iostream>
#include <map>
#include <unordered_map>

int main() {
    // 创建并初始化map容器
    std::map<int, std::string> myMap = {
        {1, "One"},
        {2, "Two"},
        {3, "Three"}
    };

    // 插入元素到map中
    myMap.insert(std::make_pair(4, "Four"));
    myMap[5] = "Five";  // 或者使用下标操作符[]

    // 输出map容器内容
    std::cout << "Map after insertions:" << std::endl;
    for (const auto& pair : myMap) {
        std::cout << pair.first << ": " << pair.second << std::endl;
    }

    // 删除元素从map中
    myMap.erase(2);  // 删除键为2的元素

    // 输出map容器内容
    std::cout << "\nMap after deletion:" << std::endl;
    for (const auto& pair : myMap) {
        std::cout << pair.first << ": " << pair.second << std::endl;
    }

    // 创建并初始化multimap容器
    std::multimap<int, std::string> myMultimap = {
        {1, "Apple"},
        {2, "Banana"},
        {2, "Orange"}
    };

    // 插入元素到multimap中
    myMultimap.insert(std::make_pair(3, "Peach"));

    // 输出multimap容器内容
    std::cout << "\nMultimap after insertions:" << std::endl;
    for (const auto& pair : myMultimap) {
        std::cout << pair.first << ": " << pair.second << std::endl;
    }

    // 删除元素从multimap中
    // 删除multimap中所有键为2的元素
    auto it = myMultimap.find(2);
    myMultimap.erase(it, myMultimap.end());

    // 输出multimap容器内容
    std::cout << "\nMultimap after deletion:" << std::endl;
    for (const auto& pair : myMultimap) {
        std::cout << pair.first << ": " << pair.second << std::endl;
    }

    return 0;
}


(3)查找和访问元素:

#include <iostream>
#include <map>
#include <unordered_map>

int main() {
    // 创建并初始化map容器
    std::map<int, std::string> myMap = {
        {1, "One"},
        {2, "Two"},
        {3, "Three"}
    };

    // 查找和访问map中的元素
    // 使用find函数查找键为2的元素
    auto it = myMap.find(2);
    if (it != myMap.end()) {
        std::cout << "Element with key 2 found: " << it->second << std::endl;
    } else {
        std::cout << "Element with key 2 not found" << std::endl;
    }

    // 修改元素的值
    myMap[1] = "One (updated)";

    // 输出map容器内容
    for (const auto& pair : myMap) {
        std::cout << pair.first << ": " << pair.second << std::endl;
    }

    // 创建并初始化multimap容器
    std::multimap<int, std::string> myMultimap = {
        {1, "Apple"},
        {2, "Banana"},
        {2, "Orange"}
    };

    // 查找和访问multimap中的元素
    // 使用equal_range函数查找键为2的元素
    auto range = myMultimap.equal_range(2);
    for (auto it = range.first; it != range.second; ++it) {
        std::cout << "Element with key 2 found: " << it->second << std::endl;
    }

    return 0;
}


(4)遍历容器的所有元素:

#include <iostream>
#include <map>
#include <unordered_map>

int main() {
    // 创建并初始化map容器
    std::map<int, std::string> myMap = {
        {1, "One"},
        {2, "Two"},
        {3, "Three"}
    };

    // 遍历map容器的所有元素
    std::cout << "Iterating through map:" << std::endl;
    for (const auto& pair : myMap) {
        std::cout << pair.first << ": " << pair.second << std::endl;
    }

    // 创建并初始化multimap容器
    std::multimap<int, std::string> myMultimap = {
        {1, "Apple"},
        {2, "Banana"},
        {2, "Orange"}
    };

    // 遍历multimap容器的所有元素
    std::cout << "\nIterating through multimap:" << std::endl;
    for (const auto& pair : myMultimap) {
        std::cout << pair.first << ": " << pair.second << std::endl;
    }

    return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值