授予对封装容器的访问权限

2023-12-10

class X {
  public:
    typedef std::list<int> Container;

    // (1)
    const Container& GetElements() const;

    // (2)
    Container::iterator ElementBegin();
    Container::iterator ElementEnd();

    // (3)
    CustomIterator GetElementIterator();

  private:
    Container m_container;
};

我正在寻找一种一致且干净的方法来为调用者提供封装容器的迭代器。我想出了上面源代码中标记的三个想法。

  1. 提供 size()、begin() 和 end(),非常适合读取访问。然而,由于返回Container引用是const,你只能使用const_iterator。返回非 const 引用是不好的,因为容器本身可以被修改(例如clear()).
  2. 提供对元素的非常量访问,但是我们经常需要一个自己的size()方法(如GetElementCount()). iterator::distance()可以使用,但这对于某些容器来说可能效率低下(其中operator++/--重复调用来计算距离)。
  3. 提供自定义迭代器,其方法如下next()等仍然是自己的size()需要方法。

我敢打赌会有更好的解决方案,所以如果您知道的话,我很高兴看到它们。


我可能会混合使用(2)和(3):

class X {
  public :
    typedef std::list<int> ElementContainer;
    typedef ElementContainer::size_type ElementSizeType;
    typedef ElementContainer::iterator ElementIterator;
    typedef ElementContainer::const_iterator ConstElementIterator;

    ElementIterator elementBegin() { return m_container.begin(); }
    ElementIterator elementEnd() { return m_container.end(); }

    ConstElementIterator elementBegin() const { return m_container.begin(); }
    ConstElementIterator elementEnd() const { return m_container.end(); }

    ElementSizeType elementSize() const { return m_container.size(); }

  private :
    ElementContainer m_container;
};

它仍然留有编写自定义迭代器的空间(通过更改typedefs),但是只要容器提供的没问题就可以使用。

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

授予对封装容器的访问权限 的相关文章

  • 查找哪些页面不再与写入时复制共享

    假设我在 Linux 中有一个进程 我从中fork 另一个相同的过程 后forking 因为原始进程将开始写入内存 Linux写时复制机制将为进程提供与分叉进程使用的不同的唯一物理内存页 在执行的某个时刻 我如何知道原始进程的哪些页面已被写
  • ASP.NET MVC 中的经典 ASP (C#)

    我有一个应用程序想要 最终 转换为 ASP NET MVC 我想要进行全面的服务升级 到 ASP NET 但想要使用当前的 ASP 内容来运行当前的功能 这样我就可以在对新框架进行增量升级的同时升级小部分 该站点严重依赖于不太成熟的 VB6
  • 使用具有现有访问令牌的 Google API .NET 客户端

    用例如下 移动应用程序正在通过 Google 对用户进行身份验证 并且在某些时候 我们需要将用户的视频发布到他的 YouTube 帐户 出于实际原因 实际发布应该由后端完成 已经存储在那里的大文件 由于用户已经通过应用程序的身份验证 因此应
  • 为什么我不能用 `= delete;` 声明纯虚函数?

    Intro 纯虚函数使用通用语法声明 virtual f 0 然而 自 c 11 以来 有一种方法可以显式地传达non existence 特殊 成员函数的 Mystruct delete eg default constructor Q
  • 如何在 Android NDK 中创建新的 NativeWindow 而无需 Android 操作系统源代码?

    我想编译一个 Android OpenGL 控制台应用程序 您可以直接从控制台启动 Android x86 运行 或者从 Android x86 GUI 内的 Android 终端应用程序运行 这个帖子 如何在 Android NDK 中创
  • 32 位应用程序的特征最大矩阵大小

    所以 我正在寻找Eigen http eigen tuxfamily org index php title Main Page当我尝试声明大于 10000x10000 的矩阵时 包崩溃 我需要声明一个像这样的矩阵 可靠地大约有 13000
  • 使用post方法将多个参数发送到asp.net core 3 mvc操作

    使用 http post 方法向 asp net mvc core 3 操作发送具有多个参数的 ajax 请求时存在问题 参数不绑定 在 dot net 框架 asp net web api 中存在类似的限制 但在 asp net mvc
  • 从 MVC 迁移到 ASP.NET Core 3.1 中的端点路由时,具有角色的 AuthorizeAttribute 不起作用

    我正在尝试将我的项目从 UseMVC asp net core 2 2 兼容样式 升级到 UseEndpoint Routing 并且我的所有请求都被重定向到我的验证失败页面 它与声明有关 如果我删除 Authorize Roles Adm
  • C++:重写已弃用的虚拟方法时出现弃用警告

    我有一个纯虚拟类 它有一个纯虚拟方法 应该是const 但不幸的是不是 该接口位于库中 并且该类由单独项目中的其他几个类继承 我正在尝试使用这个方法const不会破坏兼容性 至少在一段时间内 但我找不到在非常量方法重载时产生警告的方法 以下
  • Clang 编译器 (x86):80 位长双精度

    我正在尝试在 x86 Windows 平台上使用本机 80 位长双精度 海湾合作委员会选项 mlong double 80 https gcc gnu org onlinedocs gcc x86 Options html似乎不适用于 cl
  • C++ 异步线程同时运行

    我是 C 11 中线程的新手 我有两个线程 我想让它们同时启动 我可以想到两种方法 如下 然而 似乎它们都没有按照我的预期工作 他们在启动另一个线程之前启动一个线程 任何提示将不胜感激 另一个问题是我正在研究线程队列 所以我会有两个消费者和
  • 暂停下载线程

    我正在用 C 编写一个非常简单的批量下载程序 该程序读取要下载的 URL 的 txt 文件 我已经设置了一个全局线程和委托来更新 GUI 按下 开始 按钮即可创建并启动该线程 我想要做的是有一个 暂停 按钮 使我能够暂停下载 直到点击 恢复
  • 访问者和模板化虚拟方法

    在一个典型的实现中Visitor模式 该类必须考虑基类的所有变体 后代 在许多情况下 访问者中的相同方法内容应用于不同的方法 在这种情况下 模板化的虚拟方法是理想的选择 但目前这是不允许的 那么 模板化方法可以用来解析父类的虚方法吗 鉴于
  • 检查算术运算中的溢出情况[重复]

    这个问题在这里已经有答案了 可能的重复 检测 C C 中整数溢出的最佳方法 https stackoverflow com questions 199333 best way to detect integer overflow in c
  • 如何在c#中的内部类中访问外部类的变量[重复]

    这个问题在这里已经有答案了 我有两个类 我需要声明两个类共有的变量 如果是嵌套类 我需要访问内部类中的外部类变量 请给我一个更好的方法来在 C 中做到这一点 示例代码 Class A int a Class B Need to access
  • VB.NET vNext 中的迭代器以及 C# 中迭代​​器的限制

    我刚刚在上看到异步CTP网站 http msdn microsoft com en us vstudio async aspxVB NET 的下一个版本将有迭代器 我猜它们包含了迭代器 因为重写过程与新的迭代器所使用的过程类似 async
  • 获取 2 个数据集 c# 中的差异

    我正在编写一个简短的算法 它必须比较两个数据集 以便可以进一步处理两者之间的差异 我尝试通过合并这两个数据集并将结果更改放入新的数据集来实现此目标 我的方法如下所示 private DataSet ComputateDiff DataSet
  • 将代码拆分为标头/源文件

    我从 Asio 的示例页面中获取了以下代码 class tcp connection public boost enable shared from this
  • 为什么拆箱枚举会产生奇怪的结果?

    考虑以下 Object box 5 int int int box int 5 int nullableInt box as int nullableInt 5 StringComparison enum StringComparison
  • 双精度类型二维多维数组的 pinvoke 编组作为 c# 和 c++ 之间的输入和输出

    我有以下我正在尝试解决的双物质类型的 2d 多维数组的 c 和 c pinvoke 编组 我已经查看了以下热门内容以获得我目前拥有的内容使用双精度数组进行 P Invoke 在 C 和 C 之间编组数据 https stackoverflo

随机推荐

  • 如何从 MS Word 中的行号获取文本

    是否可以使用办公自动化从 MS Word 中的给定行号获取文本 行或句子 我的意思是 如果我可以获得给定行号中的文本或作为该行一部分的句子本身 那就可以了 我没有提供任何代码 因为我完全不知道如何使用办公自动化阅读 MS Word 我可以像
  • 将字符串数组转换为整数数组

    所以基本上用户从扫描仪输入输入序列 12 3 4 etc 它可以是任意长度 并且必须是整数 我想将字符串输入转换为整数数组 so int 0 将会12 int 1 将会3 etc 有什么建议和想法吗 我正在考虑实施if charat i 获
  • GetWindowRect 在 Windows 10 中具有偏移量

    我在程序中使用 GetWindowRect 来获取桌面上窗口的坐标 这在我用于测试的十几台电脑 XP W8 1 上运行良好 但在我的一台带触摸屏的 W10 电脑上则不然 坐标向左上角有偏移 我在 google 上搜索了 Windows 10
  • 如果数据保持不变,有没有办法让同一个 SQL 查询得到不同的结果?

    当我运行这个查询时 我间歇性地得到一个不同的结果集 有时它给出 1363 个结果 有时给出 1365 个结果 有时给出 1366 个结果 数据没有改变 可能是什么原因造成的 有什么方法可以预防吗 查询看起来像这样 SELECT FROM S
  • 使用 Java 运行 Linux/Unix 文件系统?

    我需要创建一个 Java util 它将通过 Unix 和 或 Linux 文件系统递归并构建目录结构的对象模型 检索文件信息 大小 创建日期 上次访问日期等 另外我需要检索文件所在的物理存储设备上的信息 理想情况下 该实用程序是可移植的
  • Google Chart API:更改悬停图例的颜色

    所以我有一个柱形图其中一项内置功能是 您可以将鼠标悬停在图表图例中的某个项目 所谓的类别 上 然后您会在图表中相应的列周围看到一些突出显示边框 现在 我的图表中有许多列和类别 并且很难看到突出显示的系列 类别 因为默认行为仅在列周围显示 1
  • 使用“rvalueCast”的默认 Visual Studio 项目设置

    我有了一个令人震惊讽刺 gt 的发现 默认情况下 Visual Studio 2015 不兼容 C 11 我可以按照步骤操作我在这里列出对于每个项目 或使用 Notepad 或类似工具进行文件替换 但我确实注意到 命令行 属性有一个复选框
  • 在 SQL Server 中,我可以将多个节点从表插入到 XML 中吗?

    我想根据表中的数据在存储过程中生成一些 XML 以下插入允许我添加许多节点 但它们必须是硬编码或使用变量 sql variable SET MyXml modify insert
  • 使用 JSch 作为 SFTP 客户端时如何启用被动模式?

    我正在使用 JSch 作为 SFTP 客户端 现在我需要启用被动模式由于安全方面的一些限制 但我找不到启用的方法被动模式 有人可以告诉我该怎么做吗 被动模式 是FTP协议的一个特点 在正常 FTP 模式下 对于每个单独的文件 客户端都会侦听
  • 按下空格键时,删除的复选框会重新出现在树视图节点中

    我已经使用了公认的解决方案从这个问题去除checkbox from a 树形视图节点 in my WM INITDIALOG处理程序 加载后 tree有一个适当的外观 选择节点并单击所在位置后checkbox会是 什么也没有发生 check
  • keras多层LSTM模型的股价预测收敛于恒定值

    I ve made a multilayer LSTM model that uses regression to predict next frame s values of the data The model finishes aft
  • 如何使用indexedDB的承诺在@ngrx/core中设置initialState

    我想使用 idb 包在 ngrx 中设置初始状态 该包使用 Promise 来获取数据 但每次尝试设置时都会出现错误 我读到 ngrx 是同步的 这是否意味着它不能与 Promise 一起使用 我尝试过的不同方法 这是我的 idb 包装方法
  • CPU 如何知道针对硬件中断运行哪个中断服务程序?

    例如 按下键盘上的按键 导致向CPU生成硬件中断 CPU向中断控制器发送确认 在中断处理阶段 CPU如何根据键盘上的按键判断运行哪个中断服务程序呢 None
  • 元素跟随鼠标移动和滚动

    我正在尝试编写一些 Vanilla Javascript 来使元素跟随我的鼠标移动 我使用了 clientX clientY 和 mousemove 事件来使其跟随 但是当我滚动页面时 元素不会随鼠标移动 我想也许我需要使用滚动事件 但我正
  • 将 Firebase 身份验证与 Google App Engine 结合使用

    我是新手所以任何帮助表示赞赏 我使用 Google App Engine 节点 创建了一个应用程序 服务 它返回一个简单的 hello world 响应 请参阅https resumetemplatesconverter appspot c
  • 无法使用 .NET 验证 JSON Web 令牌 – 密钥太短

    我用过JSONWebTokennpm 模块生成 jwt var jwt require jsonwebtoken var payload iss https secure example com exp 1410819380 http ex
  • `Apache` `localhost/~用户名/` 不工作

    所以我最近刚刚升级到 Mac OS X Yosemite 我需要再次设置我的 Apache 我在下面创建一个文件夹 Sites user kevin并将文件权限更改为 777 并取消注释 php5module 行 etc apache2 h
  • 使用变量中存储的类型进行 PowerShell 类型转换

    我想将 NET 对象转换为另一个 NET 类型 但是 目标 NET类型 类 存储在变量中 我不想使用 asPowerShell 运算符 我正在使用复杂的非原始类型 你将如何实现这一目标 例如 这是 PowerShell 的方式来做到这一点
  • Linux 上具有零端口的 CommPortIdentifier.getPortIdentifiers

    我正在尝试连接 ubuntu 上的串行端口 但是 它对我不起作用 我在 Windows 上成功运行了同一个项目 只是使用了不同的驱动程序 问题是我在使用它时无法加载任何端口 CommPortIdentifier getPortIdentif
  • 授予对封装容器的访问权限

    class X public typedef std list