具体来说,我有一个目前使用vector和push_back的类。我想跟踪的向量中有一个元素。推回向量可能会使迭代器无效,所以我保持其索引。使用索引再次找到迭代器很便宜。我不能保留矢量,因为我不知道会插入多少项。
我考虑过将数据结构作为模板参数,也许可以使用list。在这种情况下,从索引中查找迭代器不是一个简单的操作。由于推回列表并没有使现有元素的迭代器无效,我可以只存储这个迭代器。
但是,如何编写一个容易处理这两种情况的泛型类?
如果我可以知道push_back是否会使迭代器无效,我可以存储迭代器并在每次push_back之后通过存储操作之前的距离来更新它。
答案 0 :(得分:4)
你应该尽量避免这种灵活性。引自第2项“谨防容器独立代码的错觉”来自Effective STL作者:Scott Meyers:
面对真相:这不值得。不同的容器是 不同,它们的优点和缺点在很大程度上有所不同。它们的设计并不是可以互换的 你可以做些什么来贴纸。如果你试试,你就是 只是诱惑命运,命运不喜欢被诱惑。
如果您确实非常肯定必须维护有效的迭代器,请使用std::list
。如果您还需要随机访问,请尝试Boost.MultiIndex(尽管您将失去连续的内存访问权限)。
如果您查看标准容器适配器(std::stack
,std::queue
),您会发现它们支持自适应容器接口的交集,而不是它们的 union
答案 1 :(得分:2)
我创建了第二个类,其职责是返回您感兴趣的迭代器。 它也应该使用相同的模板参数进行参数化,然后您可以将它专门用于您想要的任何类型(矢量/列表等)。因此,在您的专业化中,您可以使用任何您想要的方法。
所以这是一些基于特质的解决方案。
答案 2 :(得分:1)
如果你真的想坚持使用矢量并具备该功能,可以看一下 http://en.cppreference.com/w/cpp/container/vector/capacity功能。将push_backs包装在已定义的函数中,甚至更好地将整个std :: vector包装在ur类中,然后再将push_backing与capacity()进行比较,以检查是否会发生调整大小。