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

[原创](Modern C++)现代C++的关键性概念: 妙用std::reference_wrapper, 让std::list容器具有随机访问功能.

[作者]
常用网名: 猪头三
出生日期: 1981.XX.XX
企鹅交流: 643439947
个人网站: 80x86汇编小站
编程生涯: 2001年~至今[共24年]
职业生涯: 22年
开发语言: C/C++、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python
开发工具: Visual Studio、Delphi、XCode、Eclipse、C++ Builder
技能种类: 逆向 驱动 磁盘 文件
研发领域: Windows应用软件安全/Windows系统内核安全/Windows系统磁盘数据安全/macOS应用软件安全
项目经历: 磁盘性能优化/文件系统数据恢复/文件信息采集/敏感文件监测跟踪/网络安全检测

[序言]
在C++11及之后的标准中, 带来了许多全新的工具和概念, 使得编程风格更为灵活和高效. 其中std::reference_wrapper便是一个非常有用的工具, 它允许以引用的方式包装对象, 并将其存储在容器中. 传统的std::list虽然在插入和删除操作上表现出色, 但由于其底层实现是链表结构, 因此并不支持随机访问. 这在某些需要快速下标访问的场景中会成为限制. 但可以使用一种巧妙的技术: 将std::list中的元素通过std::reference_wrapper映射到std::vector中, 从而获得随机访问的能力, 同时保持原始数据的同步更新. 这种方法不仅避免了数据的冗余拷贝, 还能充分利用现代C++的特性, 让代码更加简洁高效. 

[代码演示]

int main()
{
	// 主要演示: 将std::list中的元素通过std::reference_wrapper映射到std::vector中,
	// 从而实现对std::list元素的随机访问, 并保证对vector的修改能够同步反映到list上.

    // 定义一个存储随机整数的std::list容器
	std::list<int> list_RandomNum{ 1, 10, 8, 2, 3, 4, 9, 7, 6, 5 };

	// 通过std::reference_wrapper<int>方式, 将std::list容器中的每个元素引用存入std::vector容器中
    // 相当于构建了一个对std::list元素的“映射”, 从而实现随机访问
	std::vector<std::reference_wrapper<int>> vector_FromList(list_RandomNum.begin(), list_RandomNum.end());

	// 方法1: 直接通过调用get()函数来获取引用, 修改映射后的vector中第2个元素的值
	vector_FromList[1].get() = 20;

	// 方法2: 利用std::reference_wrapper的隐式转换特性, 将其转换为int&, 并修改第3个元素的值
	int& int_Ref = vector_FromList[2];
	int_Ref = 30;

	return 0;
}

[代码说明]
* 使用std::reference_wrapper:
  通过构造std::vector时使用std::reference_wrapper, 可以将std::list中的每个元素引用到std::vector中. 这样做的好处是, 不用复制数据, std::vector中的元素直接引用了std::list中的元素

* 修改操作:
  方法1: 直接通过get()方法获取引用, 然后修改这个引用所指向的值. 这会直接影响到原始的std::list中的元素.
  方法2: 通过隐式转换将std::reference_wrapper转换为int&,然后直接操作这个引用. 同样, 这也会影响到std::list中的元素.
  
[总结]
利用现代C++特性std::reference_wrapper解决传统容器局限性的, 让将std::list中的元素映射到std::vector中, 从而实现随机访问. 这种方法的优点主要包括:

* 高效性: 无需复制元素, std::vector中仅保存对list中数据的引用, 节省内存和时间开销.
* 同步更新: 对std::vector中引用的任何修改都会即时反映到原始的std::list中, 保证数据一致性.
* 灵活性: 这种技术不仅可以用于std::list, 还可以扩展到其他不支持随机访问的容器, 为开发者提供更多的设计选择.

相关文章:

  • Zookeeper(54)如何使用Zookeeper的命令行工具?
  • 寒假学习总结
  • 如何解决服务器端口被攻击:全面防护与快速响应
  • 侯捷 C++ 课程学习笔记:设计模式在面向对象开发中的应用
  • Soft Actor-Critic (SAC)算法
  • 嵌入式人工智能应用-第四章 逻辑回归 8
  • unity学习48:动态障碍物 Obstacle 对 NavMesh的影响
  • LearnOpenGL——高级OpenGL(下)
  • 企业级RAG开源项目分享:Quivr、MaxKB、Dify、FastGPT、RagFlow
  • 4.4 使用Datasets.map方法处理数据集:从基础到企业级优化
  • Spring IoC DI:控制反转与依赖注入
  • IGT_GPU_TOOL系列之CRC(一):test_grab_crc
  • SQLMesh 系列教程6- 详解 Python 模型
  • 2025/2/19机试准备
  • STM32 HAL库I2C函数使用详解:以MPU6050传感器为例
  • 配置终端代理
  • 【架构】分层架构 (Layered Architecture)
  • OpenResty
  • 无人机避障——感知篇(采用Livox-Mid360激光雷达获取点云数据显示)
  • 【CUDA 】第4章 全局内存——4.4 核函数可达到的带宽(4对角转置)【补图】
  • 线下哪些商家支持无理由退货?查询方法公布
  • 时隔4年多,这一次普京和泽连斯基能见面吗?
  • 2025年上海好护士揭晓,上海护士五年增近两成达12.31万人
  • 河北邯郸一酒店婚宴发生火灾:众人惊险逃生,酒店未买保险
  • 印度军方否认S-400防空系统被摧毁
  • 黑灰产工作室为境外诈骗集团养号引流,冒充美女与男性裸聊后敲诈勒索