c++17--std::owner_less

C++17 的透明版本 ‌:C++17 引入了 std::owner_less<void> 特化版本,具有透明性(transparent comparator)。这意味着它可以接受任意类型的智能指针作为参数(如 std::shared_ptrstd::weak_ptr),而无需显式指定模板参数,类型会自动推导。这提高了代码的灵活性,尤其适用于异构容器。‌

作用

关联容器中的键比较 ‌:当使用智能指针作为 std::setstd::map的键时,因为智能指针对象没有比较运算符重载,所以需要自己实现set和map容器的比较函数或者使用std::owner_less,std::owner_less 可以确保元素基于所有权排序,避免因指针值不同但指向同一对象导致的错误比较。‌

  • 示例:在 std::set<std::shared_ptr<int>, std::owner_less<>> 中,智能指针会按其管理的资源地址排序。

原理

std::owner_less 是 C++ 标准库中的一个函数对象(Functor),用于比较智能指针(如 std::shared_ptrstd::weak_ptr)所指向的地址的地址值,而非它们指向的对象的值。其核心原理是基于智能指针的控制块(Control Block)进行比较,而不是对象本身的内容。

复制代码
std::owner_less比较的是分配的地址的地址值,而不是地址中存储的数据,比如
int* p1=new int(100); //地址为0x1000
int* p2=new int(200); //地址为0x2000
std::owner_less比较的是0x1000和0x2000,而不是100和200。

所以只要不是同一个指针,地址就不可能相同,就可以比较。

案例

复制代码
#include <iostream>
#include <memory>
#include <set>

int main() {
  // 创建 shared_ptr
  auto sp1 = std::make_shared<int>(200);
  auto sp2 = std::make_shared<int>(100);

  // 创建对应的 weak_ptr
  std::weak_ptr<int> wp1 = sp1;
  std::weak_ptr<int> wp2 = sp2;
  std::weak_ptr<int> wp3 = sp1;

  // 使用 owner_less 的比较
  std::owner_less<std::weak_ptr<int>> comp;
  // 打印地址
  std::cout << "wp1: " << wp1.lock().get() << std::endl;
  std::cout << "wp2: " << wp2.lock().get() << std::endl;
  std::cout << "wp3: " << wp3.lock().get() << std::endl;

  // 打印比较结果
  std::cout << "wp1 < wp2: " << comp(wp1, wp2) << std::endl; // true
  std::cout << "wp1 < wp3: " << comp(wp1, wp3) << std::endl; // false,相同对象
  std::cout << "wp2 < wp1: " << comp(wp2, wp1) << std::endl; // false,不同对象

  return 0;
}
相关推荐
不会代码的小猴10 分钟前
21. 泛型编程上
开发语言·c++·笔记·算法
青瓦梦滋34 分钟前
传输层UDP/TCP协议
linux·网络·c++·网络协议·tcp/ip·udp
一只旭宝1 小时前
细讲C加加【9】C++ std::function与std::bind详解|仿函数、绑定器、类成员绑定、占位符、成员偏移指针
开发语言·c++·算法
coder!mq3 小时前
说几个常见的语法糖?
java·开发语言·算法
gugucoding3 小时前
38. 【Java】Stream API(下):高级操作与性能
java·开发语言
Lhan.zzZ3 小时前
在 Visual Studio 2022 中打造可扩展的动态链接库模块:从零搭建到原理解析
开发语言·c++·visual studio
心平气和量大福大4 小时前
android-实例-蒲公英-更新与安装-5-签名与生成APK
android·java·开发语言
码哥DFS4 小时前
构造函数、实例对象、对象原型 ----三者关系
开发语言·javascript·原型模式
quantdash_cc4 小时前
告别自建 Requests/BS4 网页爬虫:基于 QuantDash 搭建零维保的高性能量化行情流水线
开发语言·爬虫·python·pandas·量化·quantdash
ydd1001004 小时前
寻找两个正序数组的中位数 Java 题解,二分分割详解
java·开发语言