c++ 一個簡單的頁面置換實現

template <typename T>
struct CacheSequence
{
public:
	
	CacheSequence(const int seq_len)
	{
		_seq_len = seq_len;
	}
	void AddCache(const std::string& key, const T& val)
	{
		if (_cache_map.find(key) != _cache_map.end())
		{
			_life_map[key]++;
		}

		if (_cache_map.size() == seq_len)
		{
			std::string del_key = FindMaxLiefMap();
			_cache_map.erase(del_key);
			_life_map.erase(del_key);
		}

		_cache_map.insert(std::pair<std::string, T>(key, val));
		_life_map.insert(std::pair<std::string, int>(key, 0))
	}

	T VisitSequence(const std::string& key)
	{
		T retEmpyt;
		if (_cache_map.find(key) != _cache_map.end())
		{
			_life_map[key]--;
			GetOrder();
			return _cache_map[key];
		}
		return retEmpyt;
	}

private:
	void GetOrder()
	{
		std::map<std::string, int>::iterator iter;
		for (iter = _life_map.begin(); iter != _life_map.end(); iter++)
		{
			_life_map[iter->first]++;
		}

	}
	std::string FindMaxLiefMap()
	{
		std::string retKey = "";
		std::map<std::string, int>::iterator iter;
		int life_tink = 1e100;
		for (iter = _life_map.begin(); iter != _life_map.end(); iter++)
		{
			if (iter->second > life_tink)
			{
				life_tink = iter->second;
				retKey = iter->first;
			}
		}
		return retKey;
	}
private:
	int                                 _seq_len;
	std::map<std::string, T>	    _cache_map;
	std::map<std::string, int>          _life_map;

};

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章