簡體   English   中英

C ++映射分配器將項目存儲在向量中?

[英]C++ map allocator stores items in a vector?

這是我要解決的問題:在C ++中,用於地圖,多地圖等的迭代器缺少兩個理想的功能:(1)無法在運行時檢查其有效性,並且(2)沒有運算符<在它們上定義,這意味着它們不能在另一個關聯容器中用作鍵。 (我不在乎操作符<是否與鍵排序有任何關系;我只希望至少有一個<可用,以便迭代器訪問同一張地圖。)

這是解決此問題的一種可能的解決方案:說服map,multimap等將其鍵/數據對存儲在向量中,然后使迭代器成為一個小的結構,其中包含指向向量本身和下標索引的指針。 然后可以比較兩個迭代器(至少對於同一容器)(通過比較它們的下標索引),並且有可能在運行時測試迭代器是否有效。

此解決方案可以在標准C ++中實現嗎? 特別是,我可以為map類定義'Allocator'以便將項目實際放入向量中,然后將Allocator :: pointer類型定義為上一段所述的小結構嗎? 映射的迭代器與Allocator :: pointer類型如何相關? Allocator :: pointer是否必須是實際的指針,或者可以是任何支持解引用操作的東西?


更新2013-06-11:我不理解響應。 如果將(key,data)對存儲在向量中,則給定下標的項為O(1),這僅比使用直接指針的情況差一點,因此漸近性不變。 為什么響應者說地圖迭代器“沒有保留”? 該標准說,只要不刪除迭代器所引用的項,迭代器就保持有效。 至於“真正的問題”:假設我在符號表中使用了多圖(變量名->存儲位置;它是多圖而不是圖,因為內部作用域中的變量名稱可能會遮蓋同名變量),並且現在說,我需要第二個以變量為鍵的數據結構。 似乎最簡單的解決方案是將第二個映射的鍵用作迭代器,以將其映射到第一個映射中變量名稱的特定實例,如果只有迭代器具有operator <,則該迭代器才有效。

我想不是。

如果您能夠以某種方式“說服” map以將其對存儲在向量中,則可以從根本上更改map上的某些(至少兩個)保證:

  1. inserterasefind將不再是復雜的對數。
  2. insert不再能夠保證不受影響的迭代器的有效性,因為有時需要重新分配基礎vector

不過,退后一步,有兩件事向我暗示您正在嘗試“解決”錯誤的問題。

首先,通常需要一個迭代器向量。

其次,通常不檢查迭代器的有效性,因為通常不會保留迭代器。

我想知道您要解決的真正問題是什么?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM