2016-11-27 63 views
0

我有一个容器C的一些元素。在我的算法中,这些元素需要分成两个子组C1C2,它们将在此处进行排序。现在,为了避免存储相同数据的两倍,这两个亚组可以是在C++中,迭代器失效规则是否也适用于所有std容器的指针?

  1. 的std ::套指针指向元件在容器Ç,或
  2. 的std ::指向容器中的元素的迭代器的集合C

我知道它会与下面的Invalidation rules当迭代器工作良好,但是我将只使用C1C2套取消引用的实际值和移动指针/迭代C1C2或其他方式,没有别的。

概念上,它更有意义,我使用指针,但我不知道两两件事:

能使用指针实际上除了一些性病容器一些内存?(因为迭代器是指针的泛化)

Invalidation rules是否也适用于所有std容器的原始指针?

+3

参考规则也适用于指针 – Danh

+1

这些规则提到了“迭代器和引用”,它也包括原始指针。为了回答你的第一个问题,迭代器和大多数情况下的原始指针被编译成相同的东西,迭代器没有任何开销。我确信有一些“异常情况”是例外情况,但在98%的情况下,编译器会将任何迭代器的开销优化为最终二进制文件中的简单指针运算。不加这个作为答案,因为我确信有人会更专业地将它与C++标准和类似的东西联系起来,我懒得做:) – adam10603

+0

所以如果两种解决方案都是相同的记忆方式(在98%的情况下),是否有任何理由先使用另一种? – Riko

回答

1

指针的使用是否可以为某些std容器保存一些内存?

从我的观点来看,我认为指针总是会花费更少或等于迭代器。当你使用指针时,它会花费你一个指针。虽然迭代器实现不同于实现,但它必须有一些方法来引用原始容器,这会花费你一个指针或引用,这在最好的情况下会花费你和指针一样多。 this test似乎支持我。

Invalidation规则是否也适用于所有std容器的原始指针?

C++ FAQ

重要提示:即使一个参考使用底层汇编语言的地址经常被实现,请不要以为引用作为好笑的看着指针到的目的。参考是对象。它不是指向对象的指针,也不是对象的副本。 这是对象。

然后那些不your linked question基准无效不会无效指针即使该操作无效迭代器,这是unordered_[multi]{set,map}插入的情况下容器上的任何操作。

+0

取决于我们正在讨论的容器类型。有些容器会使某些操作上的所有内容无效,有些容器不会。 – adam10603

+1

@ adam10603所有无效规则都包含在该链接的问题中,我只回答了一般规则,即引用规则也适用于指针。在引用不受影响的情况下,对象不受影响,指向该对象的指针应仍然有效 – Danh

+0

@Danh您是否也可以回答第一个问题? (关于内存) – Riko