当数据结构是模板参数时,如何判断操作是否会使迭代器失效?

Nei*_*irk 15 c++ containers templates iterator invalidation

具体来说,我有一个目前使用vector和push_back的类.我想跟踪的向量中有一个元素.推回向量可能会使迭代器无效,所以我保持其索引.使用索引再次找到迭代器很便宜.我不能保留矢量,因为我不知道将插入多少项.

我已经考虑过将数据结构作为模板参数,也许可以使用list.在这种情况下,从索引中查找迭代器不是一个简单的操作.由于推回列表不会使现有元素的迭代器无效,我可以只存储这个迭代器.

但是,我如何编写一个容易处理这两种情况的泛型类?

如果我可以找出push_back是否会使迭代器无效,我可以存储迭代器并在每次push_back之后通过存储操作之前的距离来更新它.

Tem*_*Rex 4

您可能应该尽量避免这种灵活性。引用Scott Meyers 的《Effective STL》第 2 条“谨防独立于容器的代码的幻象” :

面对现实:这不值得。不同的容器是 不同的,它们的优点和缺点也有很大的不同。它们的设计并不是可以互换的,而且你几乎无法掩盖这一点。如果你尝试,你只是在诱惑命运,而命运不喜欢被诱惑。

如果您确实必须维护有效的迭代器,请使用std::list. 如果您还需要随机访问,请尝试Boost.MultiIndex(尽管您将失去连续的内存访问)。

如果您查看标准容器适配器 ( std::stackstd::queue),您会发现它们支持自适应容器接口的交集,而不是它们的并集