C++17中`std::map`和`std::set`的`extract`与`merge`操作

image.png

文章目录

    • 1. `extract`操作
      • 使用方法
      • 内部机制
    • 2. `merge`操作
      • 使用方法
      • 特点
    • 3. 性能优势
    • 4. 实际应用场景
    • 5. 总结

在C++17标准中, std::mapstd::set这两个关联容器引入了两个极具实用价值的新特性: extractmerge。这两个操作极大地增强了关联容器在处理元素转移和合并时的性能表现,同时也提升了操作的灵活性,特别是在处理大规模数据的场景下,优势尤为明显。

1. extract操作

extract函数的主要作用是从std::map或者std::set中移除指定的一个元素,并返回一个包含该元素的节点句柄(node_handle)。这个节点句柄具有特殊的功能,它可以将元素直接插入到另一个容器中,并且在此过程中不需要进行传统的拷贝或者移动操作,从而节省了大量的资源和时间。

使用方法

以下是一个简单的代码示例,展示了如何使用extract函数:

#include <iostream>
#include <map>
#include <string>int main() {std::map<int, std::string> source = { {1, "one"}, {2, "two"} };std::map<int, std::string> destination;auto node = source.extract(1); // 提取键为1的节点if (!node.empty()) {destination.insert(std::move(node)); // 将节点插入到目标容器}for (const auto& pair : destination) {std::cout << pair.first << ": " << pair.second << std::endl;}return 0;
}

在上述代码中,首先创建了一个名为sourcestd::map容器,并初始化了一些键值对。然后,使用extract函数从source中提取键为1的节点,并将其插入到destination容器中。

内部机制

extract函数在执行时,会从原容器中移除指定的元素,但是会保留该元素所占用的资源(例如内存分配)。生成的节点句柄包含了被移除元素的完整状态信息,这使得它能够以非常高效的方式插入到另一个容器中,而无需重新进行内存分配和数据拷贝等操作。

2. merge操作

merge函数的功能是将一个容器中的所有元素高效地合并到另一个容器中。与传统的通过循环插入元素或者使用std::merge算法的方式相比,merge操作具有更高的效率,因为它不需要进行元素的拷贝或者移动操作,而是直接将节点从一个容器转移到另一个容器。

使用方法

下面的代码展示了如何使用merge函数:

#include <iostream>
#include <map>
#include <string>int main() {std::map<int, std::string> map1 = { {1, "one"}, {2, "two"} };std::map<int, std::string> map2 = { {3, "three"}, {4, "four"} };map1.merge(map2); // 将map2中的所有元素合并到map1for (const auto& pair : map1) {std::cout << pair.first << ": " << pair.second << std::endl;}return 0;
}

在这个示例中,创建了两个std::map容器map1map2,并分别初始化了一些键值对。然后,通过调用map1.merge(map2)map2中的所有元素合并到map1中。

特点

  • merge操作的时间复杂度为O(1),这是因为它直接操作容器的节点,而不需要重新分配内存或者进行元素的拷贝和移动操作。
  • 合并后的元素会保持原有的顺序,这一特性非常适合用于有序容器,如std::mapstd::set

3. 性能优势

在C++17之前,开发者在合并容器时,通常会采用循环插入或者std::merge算法等方式。这些传统方法虽然能够实现容器的合并,但是在性能上存在一定的瓶颈。例如,循环插入操作会导致大量的内存分配和拷贝操作,从而消耗较多的时间和资源。

extractmerge操作通过直接操作容器的节点,避免了这些不必要的开销,显著提升了性能。以下是一个性能对比表格:

操作类型使用extract/merge传统方法(拷贝/移动)
时间复杂度O(1)O(n)
内存分配与释放次数最小化多次
CPU使用率较低较高

4. 实际应用场景

extractmerge操作在处理大规模数据的场景中具有非常重要的应用价值。例如,在实时数据处理系统中,需要频繁地将数据从一个容器转移到另一个容器进行处理,使用extractmerge操作可以高效地完成这一任务,而无需担心性能问题。

以下是一个简单的示例代码,模拟了数据处理和转移的过程:

#include <iostream>
#include <map>
#include <string>std::map<int, std::string> initialData = { {101, "DataA"}, {102, "DataB"} };
std::map<int, std::string> processedData;void processData(int key) {auto node = initialData.extract(key);if (!node.empty()) {processedData.insert(std::move(node));}
}int main() {processData(101);for (const auto& pair : processedData) {std::cout << pair.first << ": " << pair.second << std::endl;}return 0;
}

在这个示例中,定义了一个processData函数,该函数从initialData容器中提取指定键的元素,并将其插入到processedData容器中,实现了数据的高效处理和转移。

5. 总结

C++17引入的extractmerge操作为std::mapstd::set提供了更为高效、灵活的元素转移和合并方式。这些新特性不仅显著提高了程序的性能,减少了不必要的资源消耗,同时也简化了代码逻辑,使得开发者能够更加高效地处理大规模数据。

如果你正在使用C++17或更高版本的编译器,强烈建议你尝试使用这些新特性,它们很可能会为你的项目带来显著的性能提升和代码优化效果!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/70030.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

当时只道是寻常

晴&#xff0c;2025年2月16日 卸载了油管、脸书和 X 手机 app &#xff0c;太浪费我时间&#xff0c;以后再去经营吧。 教学技能大赛材料需要在明天之内搞定——《教学实施方案》。感觉玄&#xff0c;同部门有经验的老师说至少花一周时间。 只能明天早点继续接着弄&#xff…

每日一题——把数字翻译成字符串

把数字翻译成字符串 题目描述示例示例1示例2 题解动态规划代码实现复杂度分析 总结 题目描述 有一种将字母编码成数字的方式&#xff1a;‘a’->1, ‘b’->2, … , ‘z’->26。 现在给一串数字&#xff0c;返回有多少种可能的译码结果。 数据范围&#xff1a;字符串…

Express 中 res 响应方法详解

一、res.send() 1. 功能 该方法用于发送各种类型的响应&#xff0c;包括字符串、对象、数组、Buffer 等。它会自动设置响应的 Content-Type 头。 2. 示例代码 const express require("express");const app express();app.get("/", (req, res) > {…

vue-谷歌浏览器安装vue-devtools插件

文章目录 一、谷歌浏览器安装vue-devtools1.1、方式一&#xff1a;直接下载crx并安装 本文讲解谷歌浏览器安装vue-devtools插件的步骤。 注意&#xff1a;以下vue-devtools插件都是vue2版本的。 一、谷歌浏览器安装vue-devtools 1.1、方式一&#xff1a;直接下载crx并安装 …

【计算机网络】网络层数据包(Packet)格式

在计算机网络中&#xff0c;数据包&#xff08;Packet&#xff09; 是网络层的协议数据单元&#xff08;PDU&#xff09;&#xff0c;用于在不同网络之间传输数据。数据包的格式取决于具体的网络层协议&#xff08;如 IPv4、IPv6 等&#xff09;。以下是常见数据包格式的详细说…

C#关于静态关键词static详解

Demo代码&#xff1a; public class HomeController : Controller {private DateTime time1 DateTime.Now; // 实例字段private static DateTime time2 DateTime.Now; // 静态字段[HttpGet("index")]public async Task Index(){Console.WriteLine($"now&am…

嵌入式玩具--无人机字幕

day01 01-无人机-组成结构-上 哎&#xff0c;好&#xff0c;各位&#xff0c;那现在呢我们一起来看一下&#xff0c;就是咱们接下来要做的这个小项目啊。呃&#xff0c;当然这个名字有很多啊&#xff0c;就是这种飞行器有管&#xff0c;它叫四旋翼飞行器的&#xff0c;也有叫…

Hami项目开发笔记

如果还不了解hami&#xff0c;请阅读文章&#xff1a;hami入门学习 Hami提供了两个维度的监控能力&#xff0c;集群级别和节点级别&#xff0c;以及Pod真实占用的GPU和虚拟分配的GPU。 {scheduler node ip}:31993/metrics records the snapshot of allocated devices, includi…

机器学习 - 理论和定理

在机器学习中&#xff0c;有一些非常有名的理论或定理&#xff0c;对理解机器学习的内在特性非常有帮助。本文列出机器学习中常用的理论和定理&#xff0c;并举出对应的举例子加以深化理解&#xff0c;有些理论比较抽象&#xff0c;我们可以先记录下来&#xff0c;慢慢啃&#…

【devops】Github Actions Secrets | 如何在Github中设置CI的Secret供CI的yaml使用

一、Github Actions 1、ci.yml name: CIon: [ push ]jobs:build:runs-on: ubuntu-lateststeps:- name: Checkout codeuses: actions/checkoutv3- name: Set up Gouses: actions/setup-gov4with:go-version: 1.23.0- name: Cache Go modulesuses: actions/cachev3with:path: |…

springCloud-2021.0.9 之 GateWay 示例

文章目录 前言springCloud-2021.0.9 之 GateWay 示例1. GateWay 官网2. GateWay 三个关键名称3. GateWay 工作原理的高级概述4. 示例4.1. POM4.2. 启动类4.3. 过滤器4.4. 配置 5. 启动/测试 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收…

华为IPD简介

创作灵感 现在“熟悉华为IPD”经常出现在高级招聘岗位能力要求上&#xff0c;于是作者写下此文章以此巩固相关知识储备 名词解释 华为IPD&#xff08;Integrated Product Development&#xff0c;集成产品开发&#xff09;是华为引入并优化的一套产品开发管理体系&#xff0…

UniApp 中制作一个横向滚动工具栏

前言 最近在用 UniApp 开发项目时&#xff0c;需要一个横向滑动的工具栏。常见的工具栏一般都是竖着的&#xff0c;但横向滑动的工具栏不仅能展示更多内容&#xff0c;还能让界面看起来更加丰富。不过很多朋友可能会发现&#xff0c;如何让内容“横着”展示又不变形、能流畅滚…

java nio 原理 非阻塞IO Netty

一、为什么必须去了解NIO 首先你需要之后Netty的主要实现手段就是Nio,很多人一直学不明白Netty&#xff0c;根本原因是 除了日常开发中很难能够实践&#xff0c;很大一部分原因是不熟悉NIO&#xff0c;事实上真正熟悉了NIO和它背后的原理之后&#xff0c;去查看Netty的源码就有…

Managed Lustre 和 WEKA:高性能文件系统的对比与应用

Managed Lustre 和 WEKA&#xff1a;高性能文件系统的对比与应用 1. 什么是 Managed Lustre&#xff1f;主要特点&#xff1a;适用场景&#xff1a; 2. 什么是 WEKA&#xff1f;主要特点&#xff1a;适用场景&#xff1a; 3. Managed Lustre 和 WEKA 的对比4. 如何选择 Managed…

el-select 添加icon

Element-ui-plus 新版本&#xff1a;Select 选择器 | Element Plus 要实现如上的效果 &#xff0c;要用到具名插槽 prefix&#xff0c;看代码&#xff1a; <template><el-dialog ref"dialogRef" v-model"dialogVisible" :title"title"…

【Linux】Ubuntu Linux 系统 ——PHP开发环境

ℹ️大家好&#xff0c;我是练小杰&#xff0c;元宵节到了&#xff0c;在此祝大家元宵节快乐&#x1f606; 新的一年里&#xff0c;愿你步步高升&#xff0c;事事如意&#xff0c;心想事成&#xff01;! 本文是关于Linux 操作系统中部署PHP开发环境这部分基础内容&#xff0c;后…

非谓语动词三驾马车

文章目录 1. 不定式基本结构不定式的由来1.不受主语的人称和数的限制2.没有限定时态3.可以在句子中充当不同的成分 常见句子成分1. 作主语2. 作表语3. 作宾语4. 作定语5. 作状语 不定式 vs 动名词 2. 动名词动名词做成分作主语作主语补语作定语作宾语介词宾语 3. 分词(现在、过…

【Apache Paimon】-- 16 -- 利用 paimon-flink-action 同步 kafka 数据到 hive paimon 表中

目录 引言CDC 技术概述 2.1 什么是 CDC2.2 CDC 的应用场景Kafka 作为 CDC 数据源的原理与优势 3.1 Kafka 的基本架构3.2 Kafka 在 CDC 中的角色

利用Python pandas 数据清洗详细教程

文章目录 前言一、环境搭建1. 下载 Python2. 安装 Python3 使用 pip 安装 Pandas 二、使用步骤1.读取数据2.处理缺失值3. 处理重复值4. 处理异常值5. 数据类型转换6. 处理不一致的数据 前言 pandas 是 Python 数据处理与分析的得力工具&#xff0c;功能强大&#xff0c;是数据…