15

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

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

但是我如何编写一个可以轻松处理这两种情况的通用类呢?

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

4

3 回答 3

4

您可能应该尽量避免这种灵活性。引用Scott Meyers的Effective STL的第 2 项“当心容器独立代码的错觉” :

面对事实:这不值得。不同的容器是 不同的,它们的优点和缺点也有很大的不同。它们的设计不是可互换的,您可以做一些事情来解决这个问题。如果你尝试,你只是在诱惑命运,而命运不喜欢被诱惑。

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

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

于 2013-09-16T11:46:21.220 回答
2

我将创建第二个类,其职责是返回您感兴趣的迭代器。它也应该使用相同的模板参数进行参数化,然后您可以将其专门用于您想要的任何类型(向量/列表等)。因此,在您的专业范围内,您可以使用任何您想要的方法。

所以这是一些基于特征的解决方案。

于 2013-09-16T11:44:30.080 回答
1

如果您真的想坚持使用向量并拥有该功能,可以查看
http://en.cppreference.com/w/cpp/container/vector/capacity函数。将您的 push_backs 包装在定义的函数中,或者甚至更好地将整个 std::vector 包装在您的类中,然后在 push_backing 之前将容量与 size() 进行比较,以检查是否会发生调整大小。

于 2013-09-16T11:48:49.600 回答