在stl或一般情況下是否存在一種「反向」關聯容器? 例如我想有一個容器,其中相同的元素由一組鍵共享。「反向」關聯容器?
比方說,我的重點是int
,那麼我將不得不例如:
container.at(3) -> some object A
container.at(4) -> same object A
container.at(1) -> other object B
這個容器必須(最好)同樣複雜性的std ::地圖爲不同的操作。這樣的事情可能嗎?
我在考慮首先使用std::map<int, T*>
其中幾個索引指向同一個對象,但是當從地圖中移除一個項目時,運行時間在O(n)中,因爲您必須檢查另一個項目,看看你是否需要刪除T object
是否有這種容器「本地」在STL或在提升?
編輯: 利用的一些例子:
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)當你不得不減少計數器給定的指針 – lezebulon