STL的value语义和reference语义【待更新】

本文探讨了在不同容器内管理同一对象的问题,并提供了解决方案:通过插入对象的指针而非对象本身来实现。这种方式避免了多次复制同一对象,提高了程序效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

当将一个数A插入容器,只是将A的副本插入容器,因此不能在不同容器内管理同一个对象。  //value语义

 

解决方法:插入的是指针(尽量是智能型指针)即可                 //reference语义

### std::reference_wrapper 的作用 `std::reference_wrapper` 是 C++ 标准库中的一个模板类,用于创建对象的引用包装器。这使得可以将引用作为值来处理,从而允许这些引用被存储在容器中或传递给需要按值语义的地方。 #### 主要功能特性 - **构造函数**:可以通过传入实际的对象来初始化 `std::reference_wrapper` 实例。 ```cpp int value = 42; auto ref_to_value = std::ref(value); ``` - **复制构造函数与赋值操作符**:支持拷贝构造其他类型的转换,确保引用关系得以保持[^1]。 - **成员函数**:提供了获取原始对象的方法 `.get()` ,以及解引用运算符重载以便自然地访问所指向的对象属性或调用其方法。 ```cpp // 获取原始对象 int originalValue = ref_to_value.get(); // 解引用并修改原变量 *ref_to_value = 84; // 修改了value本身 ``` ### 使用场景 当需要向那些只接受值参数而非引用参数的标准库算法或容器提供对现有对象的间接访问时,`std::reference_wrapper` 就显得非常有用。例如,在 STL 容器内保存多个不同生命周期管理策略下的资源指针而不改变它们的实际所有权状态;或者是在多线程环境中共享某些不可变数据结构的同时避免不必要的深拷贝开销。 另一个典型的应用案例就是配合像 `emplace_back` 这样的接口工作,它可以直接利用就地构造机制减少临时对象产生的性能损耗[^2]: ```cpp struct MyClass { int num; std::string str; MyClass(int n, const std::string& s):num(n),str(s){} }; std::vector<std::reference_wrapper<MyClass>> vec; vec.emplace_back(MyClass(10,"Hello")); ``` 上述代码片段展示了如何使用 `std::reference_wrapper` 来封装 `MyClass` 类型的对象,并将其添加到动态数组 `vec` 中去。这里的关键在于通过 `emplace_back` 函数实现了高效的内存分配过程,因为不需要先创建再转移拥有权的操作步骤。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值