【问题标题】:Is this a correct way to manipulate the elements of a C++ container?这是操作 C++ 容器元素的正确方法吗?
【发布时间】:2014-09-27 12:28:49
【问题描述】:

我有一个 map 形式为 map<long, class> 的元素,我在 long 上搜索一个元素,返回 pair<bool, class&> 形式的结果 - 指示引用是否有效的布尔值。

引用来自迭代器,即it->second 形式,其中it 是指向具有正确longmap 元素的迭代器。

然后我在另一个函数中继续操作对类实例的引用。

所以我的问题是:

  • 这是返回引用的有效方式吗?
  • 并且操作引用的对象会改变地图中包含的元素吗?

如果这些问题看起来像愚蠢的问题,请提前道歉:我认为答案很简单,但我的代码行为不端,所以我试图填补所有可能的空白。

【问题讨论】:

  • 如果map 被更改,这是否应该保持有效?
  • 作为侧节点:使用myMap.find(longValue) 查找您要查找的内容。

标签: c++ map reference iterator containers


【解决方案1】:

1) 只要引用仅在 bool 标志为 true 时使用,并且引用的对象没有从映射中删除。

2) 虽然我认为这在技术上是有效的,但我不会这样做。我将传递一个指向类的指针,而不是 bool 和引用,nullptr 表示在映射中找不到类实例。

3) 是的,修改引用/指向的实例会修改地图中的对象;只要在沿途某处您没有意外复制对象,现在指的是副本,而不是地图中的原始对象。

【讨论】:

    【解决方案2】:

    这是返回引用的有效方式吗?

    没有。如果没有要引用的对象,则不能创建“无效引用”;所以在这种情况下,你需要弄乱一个虚拟对象来引用。

    返回一个指针。它更简单、更小、不那么令人惊讶,并且(最重要的是)如果没有可指向的对象,它可以合法地为 null。

    并且操作引用的对象会改变地图中包含的元素吗?

    是的;可以使用指向地图元素的引用或指针来操作该元素。

    【讨论】:

    • 如果它是假的,我会返回一个假人。
    • @adrianmcmenamin:在这种情况下它是有效的;只是奇怪、低效和过于复杂。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-25
    • 1970-01-01
    • 2016-10-25
    相关资源
    最近更新 更多