【发布时间】:2012-09-19 00:25:36
【问题描述】:
在 stl 或一般情况下是否存在一种“反向”关联容器? 例如,我想要一个容器,其中相同的元素由一组键共享。
假设我的密钥是int,那么例如:
container.at(3) -> some object A
container.at(4) -> same object A
container.at(1) -> other object B
对于不同的操作,这个容器(理想情况下)具有与 std::map 相同的复杂性。这样的事情可能吗?
我最初考虑使用std::map<int, T*>,其中几个索引指向同一个对象,但是当从地图中删除一个项目时,运行时间在 O(n) 中,因为你必须检查其他项目看是否需要删除T object
在 stl 或 boost 中是否已经“本地”存在这种容器?
编辑: 一些使用示例:
container<int, myClass> myContainer;
myClass obj(...); //new object
myContainer.insert(3, obj); //insert object for specific key
myContainer.insert(2, obj); //insert same object for specific key, since both objects would compare equal we would actually not "insert" a new object but have it shared by both keys
myContainer.duplicate_object(2,5); //key 5 also has the same object as key 2 (and 3)
myContainer.getAllKeys(2); //would return 2,3 and 5 since they all reference the same object as key 2
myContainer.removeKey(3);
myContainer.removeKey(2);
myContainer.removeKey(5); //would destroy the object here, not before
【问题讨论】:
-
我不明白这个问题。您的标题使用“反向”一词,您的问题使用“反向”一词。无论哪种方式,您的示例仍然没有阐明您的意思。你能举例说明如何使用这样的容器吗?假设存在 reverse_container 或 inverse_container 并编写一个 main() 方法来说明其工作原理。
-
此外,某种计数器仍可让您在 O(1) 时间内删除。每次添加对象时计数器都会递增,每次删除时计数器都会递减。当计数达到零时,您可以将其删除。 (当然,这可能意味着扩展或包装 std::map。)
-
@ Code-Guru :关于拥有一个计数器:对于地图中的所有指针,您仍然必须在某处存储一个容器,说明该指针由 n 个键使用。因此,当您必须为给定指针递减计数器时,我看不出它怎么可能是 O(1)
-
std::map<int, boost::shared_ptr<T>>呢?