[英]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.