是否可以使用与 std::set 中包含的类型不同的元素来执行搜索和删除?

2023-11-21

假设我有以下内容:

struct MetadataThingy {

    void *actual_thingy;
    int some_metadata;
    int more_metadata;

    bool operator<(MetadataThingy const& other) const {
        return actual_thingy < other.actual_thingy;
    }

};

where actual_thingy指向一些重要的数据,我希望容器按值排序actual_thingy而不是指向的元素的值,但我需要存储有关它的一些其他数据,所以我创建了包装类MetadataThingy与一个比较器,只考虑的值actual_thingy指针(而不是使用容器void *)

现在,给出以下代码:

std::set<MetadataThingy> thingy_set;

void test() {

    MetadataThingy m1 { nullptr, 5, 20 };
    MetadataThingy m2 { &m1, 1, 2 };
    MetadataThingy m3 { &m2, 6, 0 };

    thingy_set.insert(m1);
    thingy_set.insert(m2);
    thingy_set.insert(m3);

    MetadataThingy m;
    m = *thingy_set.find(m2); // OK.
    m = *thingy_set.find(static_cast<void *>(&m2)); // Nope. Can't use a pointer.

}

由于每个MetadataThingy可以通过它存储的指针值唯一标识并按指针值排序,只需使用void *作为钥匙。但就目前情况而言,我必须创建一个虚拟对象MetadataThingy每次我搜索一个元素,都感觉很混乱。我已经考虑过只使用map以指针为键并且MetadataThingy作为价值,但因为每个MetadataThingy无论如何还必须包含指针,这感觉有点多余。所以,考虑到两种类型的元素是相互可比的,有没有办法使用集合中存储的类型以外的元素来查找或删除集合中的值并且一种类型的元素可以唯一地映射到另一种类型(void * and MetadataThingy是同构的)? (我没有在上面的代码中包含任何内容,但假设有用于比较的运算符重载void * and MetadataThingy以任何顺序。)

关于我试图解决的问题的一些背景知识,以防万一有人可以推荐更好的方法:我需要按多个标准订购集合,所以我有几个MetadataThingy容器,全部按不同标准排序。在这种情况下,“元数据”将是我需要跟踪所有容器中元素的位置的内容,以便我可以快速删除。这听起来像是增强多索引容器的完美工作,但这些元素的顺序不断变化,据我所知这意味着它不起作用。


从 C++14 开始,std::set具有查找函数的模板化版本find, lower_bound等等。它们允许您传递任何对象进行比较,只要比较器支持即可。

这意味着您可以直接通过void* to find,只要比较器支持比较MetadataThingy and void*.

有关更多信息,请参阅http://en.cppreference.com/w/cpp/container/set/find.

了解有关限制Compare::is_transparent, 我发现这个 StackOverflow 问题很有帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是否可以使用与 std::set 中包含的类型不同的元素来执行搜索和删除? 的相关文章

随机推荐

  • 如何加快 Gensim Word2vec 模型加载时间?

    我正在构建一个聊天机器人 因此需要使用 Word2Vec 对用户的输入进行矢量化 我正在使用 Google 提供的包含 300 万个单词的预训练模型 GoogleNews vectors male300 所以我使用 Gensim 加载模型
  • 在 CMake 中获取目标依赖的所有源文件

    使用 CMake 如何获取进入可执行目标的所有源文件的列表 包括该可执行文件所依赖的所有目标中的所有源 我们在代码库中有一个模式 其中构建系统根据源树中的文件名和路径生成初始化程序调用程序 因此 我需要可执行目标所依赖的所有源文件的完整路径
  • Android - 如何使用新的存储访问框架将文件复制到外部 SD 卡

    我正在我的应用程序中实现文件浏览器功能 我知道如何使用 ACTION OPEN DOCUMENT TREE 意图获得外部 SD 卡的持久权限 以及如何使用 DocumentFile 类创建文件夹和删除文件 文件夹 但是 我无法找到将文件复制
  • 编译 ng-bind-html 后 ng-click 不起作用

    我有一个指令 app directive dir function compile sce return restrict E link function scope element attr scope watch content fun
  • 如何删除Python中的标点符号?

    我有一个问题 前任 我有一句话 s AAA BBB CCC 所以 我这样做 import string table str maketrans string punctuation s w translate table for w in
  • 公开受保护字段的最佳方式

    我有一个像这样的基类 public class BaseModalCommand protected object m commandArgument protected int m commandID protected int m en
  • 暂停脚本执行的 jQuery 确认框

    我正在寻找一个 jquery 漂亮的标准对话框替代品 jQUery UI 有一个很好的功能 但它不会像confirm 那样暂停脚本执行以等待响应 下面的演示应该显示两个 div 显示前面确认框的选择 但 jquery 对话框不会导致脚本等待
  • 如何让子模块触发 Jenkins 构建

    我有一个子模块 A 它不是独立的应用程序 它需要主应用程序才能工作 我想为 A 创建一个 CI 构建 以便每当将提交推送到 A 时 它都会触发使用主项目代码的构建 我该如何在詹金斯中做到这一点 我需要做什么 对 A 的提交会触发构建 该构建
  • Code Golf:重复文本的“颜色突出显示”

    Locked 这个问题及其答案是locked因为这个问题是题外话 但却具有历史意义 目前不接受新的答案或互动 感谢下面的 greg0ire 帮助理解关键概念 挑战 构建一个程序来查找所有子字符串并使用颜色属性 标记 它们 在 XML 中有效
  • 将单个 Excel 工作表另存为 CSV

    我需要解析 Excel 工作表 现在 我将每个单独的工作表另存为 csv 效果非常好 我使用 OpenCSV 来解析文件等 但创建这些 csv 文件很痛苦 在 Excel 中将单个工作表另存为 csv 的最简单 最快捷的方法是什么 我假设某
  • 使用 Shadow DOM 有哪些缺点?

    在教程中我只看到了 Shadow DOM 的优点 但也应该有缺点 在哪些情况下我们应该避免使用 Shadow DOM Shadow DOM 功能既可以被视为优点 也可以被视为缺点 风格隔离如果您想要的话 这是一个好处 但如果用户想从全局 C
  • 从预处理器中的常量中删除强制转换

    背景 在微控制器代码中 我使用生产商提供的库 其中定义了许多常量 如果我的一些常量 与微控制器外部的组件共享 与git subtree 和微控制器常数 例如 该库定义 ifdef SOME PARTICULAR MODEL define F
  • SSRS 2008 R2 - SSRS 2012 - ReportViewer:在 Safari/Chrome 中报告,但在 Firefox/Internet Explorer 8 中工作正常...为什么?

    我有一些简单的报告SSRS 2008 R2 但它们根本不会在 Safari 或 Chrome 中显示 根据微软的在线图书 这些浏览器的支持方式有限 但是 数据 加载 时钟完成后我看不到任何内容 页面顶部的参数栏和面包屑导航部分都在那里 此外
  • 仍然对 Python 中的可变默认参数值“陷阱”感到困惑[重复]

    这个问题在这里已经有答案了 我知道不应该使用可变的默认参数值在 Python 中 有一些例外 因为该值仅在定义函数时计算和存储一次 而不是在以后每次调用函数时计算和存储 我对此的理解是这样的 使用下面的例子 请原谅我的不精确的语言 因为我只
  • 仅将 dropShadow 添加到网格窗格 JavaFx 2.2 的边框

    只想将阴影添加到网格窗格的边框而不是内部子元素 here is the image of screen showing the effect 使用 StackPane 并将 GridPane 放入其中 使用 CSS 设置 StackPane
  • 动态改变colors.xml的值来改变android应用程序的外观和感觉

    问题 我正在尝试动态更改 Android 应用程序的外观和感觉 例如 应用程序启动并从服务器获取一组值 这些值是通常位于colors xml 中的元素 我正在寻找的是一种动态更改colors xml 中的元素并使用从服务器接收到的这些新值进
  • 如何使用 Delphi 中的当前区域设置格式化整数

    var i integer i 1234567 鉴于上述情况 我希望字符串 1 234 567 作为输出 假设英国区域设置 IntToStr 只是给我 1234567 我确信有一个单行线可以解决这个问题 但我找不到它 尝试格式化功能 Lab
  • 如何保留嵌入小部件的样式?

    如何制作外部PHPwidget页面有自己的CSS 问题是 当外部页面是included 它受到样式表的影响host page 包含的页面实际上是一个注释 小部件 带有自己的 css 文件 大约 30 行 不多 并且高度和宽度的灵活性是必须具
  • 如何将Jupyter笔记本上的环境切换为新笔记本?

    我有一个具有各种环境的实例 有些笔记本与不同的环境兼容 例如notebook1 用于 MXNet notebook2 用于 Tensorflow 从notebook1移动到notebook2时如何跳转到新环境 我尝试这样做 但这不适用于 J
  • 是否可以使用与 std::set 中包含的类型不同的元素来执行搜索和删除?

    假设我有以下内容 struct MetadataThingy void actual thingy int some metadata int more metadata bool operator lt MetadataThingy co