最初はLRUの定義であり、LRUは、データが最近訪問された場合、最低使用、その後、将来のアクセスの確率も高くなっている表します。
だから、ロジックは、リストの長さの制限を超えた場合、それはテールキックの要素が一覧表示されます、ページがリストの先頭にアクセスされるたびに新しいなければなりません。
主要構造、STLリストの二重にリンクリスト構造。
主な操作が取得され、値に対応するアクセスキーを表し、二重リンクリストを問い合わせる値に対応するキーを見つけるし、リストから削除するには、この時間は、リストの先頭に挿入します。
SET、キー値に対応する設定値を示し、対応するキー要素を見つけるために、この時間は、それがリストから削除し、リストの先頭に挿入されます。
ここで削除してsetHead、要素と要素を削除する責任がありますが、リストの先頭に追加されている2つのヘルパーを設定します。
コードは次のように実装されています。
書式#include <iostreamの> の#include <リスト> の#include <反復子> 書式#include <アルゴリズム> 使用して名前空間はstdを、クラスLRUNode { パブリック: int型のキー、値; LRUNode(INT _key、INT _value):キー(_key)、値(_value) { } ブール演算子 ==(LRUNode *のP) { リターンキー== P-> キー。 } }。クラスLRU { パブリック: int型のget (のInt KEY); ボイド SET(INTキー、INT ヴァル)、 LRU(int型_cap):CAP(_cap) { } int型の CAP; // 代表的に格納されたページの最大数 ボイド削除(INT KEY); ボイド setHead(INTキー、INT ヴァル); ボイドprintLis(); リスト <LRUNode *> LIS; }; 無効LRU :: printLis() { リスト <LRUNode *> :: ITをイテレータ。 ため(それはlis.beginを()=;それ= lis.end();!それ++ ) { coutの <<(*それを) - >キー<< " " <<(*それを) - >値<< てendl; } COUT << ENDL。 } ボイド LRU ::削除(int型のキー) { LRUNode * searchNode = 新しい LRUNode(鍵、0 ); リスト <LRUNode *> ::それが=イテレータ見つける(lis.begin()、lis.end()、searchNode)。 もし(!それ= lis.end()) { lis.remove( * これ)。 } } 無効 LRU :: setHead(INTキー、INT ヴァル) { lis.push_front(新しいLRUNode(キー、ヴァル))。 } INT LRU :: 得る(int型のキー) { LRUNode * searchNode = 新しい LRUNode(鍵、0 ); リスト <LRUNode *> ::それが=イテレータ見つける(lis.begin()、lis.end()、searchNode)。 もし(!それ= lis.end()) { 削除(( * IT) - > キー)。 setHead(( * IT) - >キー、(* IT) - > 値); リターン(* IT) - > 値。 } 戻る - 1。// 表示没有找到 } ボイド LRU :: セット(INTキー、int型の値) { 場合(lis.size()> = CAP) { lis.pop_back()。 } LRUNode * searchNode = 新しい LRUNode(鍵、0 ); リスト <LRUNode *> ::それが=イテレータ見つける(lis.begin()、lis.end()、searchNode)。 もし(!それ= lis.end()) { (キー)を削除します。 setHead(キー、値)。 } 他 { setHead(キー、値)。 } } int型のmain() { LRU * LRU = 新しい LRU(5 )。 LRU - > セット(1、1 )。 LRU - > printLis(); LRU - > セット(2、2 )。 LRU - > printLis(); LRU - > セット(3、3 )。 LRU - > printLis(); LRU - > セット(4、4 )。 LRU - > printLis(); LRU - > セット(5、5 )。 LRU - > printLis(); LRU - > セット(6、6 )。 LRU - > printLis(); LRU - > セット(7、7 )。 LRU - > printLis(); リターン 0 ; }
結果:
1 1 2 2 1 1 3 3 2 2 1 1 4 4 3 3 2 2 1 1 5 5 4 4 3 3 2 2 1 1 6 6 5 5 4 4 3 3 2 2 7 7 6 6 5 5 4 4 3 3