簡體   English   中英

有沒有辦法限制STL地圖的大小?

[英]Is there any way to limit the size of an STL Map?

我想在C ++中實現某種用作緩存的查找表。 它旨在模擬我正在模擬的一塊硬件。

密鑰是非整數的,所以我猜測哈希是有序的。 我無意發明輪子所以我打算使用std::map (雖然歡迎提供替代方案的建議)。

問題是,有沒有辦法限制散列的大小來模擬我的硬件有限大小的事實? 我希望哈希的insert方法返回錯誤消息,或者如果達到限制則拋出異常。

如果沒有這種方式,我會在嘗試插入之前檢查它的大小,但這似乎是一種不太優雅的方式。

首先, map結構不是hash table ,而是平衡的二叉樹。 對於最佳散列實現,這對查找時間O(log N)而不是O(1)有影響。 這可能會或者不會影響您的問題(如果實際鍵和操作的數量很小就足夠了,但緩存的仿真可能在某種程度上不是最理想的。

您可以做的最簡單的解決方案是將實際數據結構封裝到一個類中,該類檢查每次插入的大小(大小查找應該在所有STL實現中以恆定時間實現),如果您嘗試添加太多元素,則會失敗。

class cache {
public:
   static const int max_size = 100;
   typedef std::map<key_t, value_t> cache_map_t;
   void add( key_t key, value_t value ) {
      cache_map_t::const_iterator it = m_table.find( key );
      if ( it != m_table.end() && m_table.size() == max_size ) { 
         // handle error, throw exception...
      } else {
         m_table.insert( it, std::make_pair(key,value) );
      }
   }
private:
   cache_map_t m_table;
};
// Don't forget, in just one translation unit:
const int cache::max_size;

沒有辦法“自動”限制std::map的大小,只是因為“有限的std::map ”不再是std::map

std::map包裝在您自己的類中,它只是在插入之前檢查std::map的大小與常量,並在達到最大大小時執行任何操作。

如果你正在實現LRU緩存或類似的,我發現boost :: bimap非常寶貴。 使用一個索引作為主“對象ID”鍵(如果您有簡單的對象枚舉,則可以是高效的矢量視圖),另一個索引可以是有序時間戳。

暫無
暫無

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

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