Обнаружьте и исправьте дефекты в реализации LRU‑кэша
Условие задачи
<p>Найдите недочёты в следующем классе, из‑за которых его нельзя использовать в продакшн‑окружении.</p>
<pre><code class="language-cpp"><span class="hljs-keyword">class</span> <span class="hljs-title class_">TLruCache</span> {
<span class="hljs-keyword">private</span>:
<span class="hljs-type">int</span> maxSize = <span class="hljs-number">0</span>;
<span class="hljs-type">int</span> timestamp = <span class="hljs-number">0</span>;
unordered_map<<span class="hljs-type">int</span>, <span class="hljs-type">int</span>> lastAccess;
unordered_map<<span class="hljs-type">int</span>, <span class="hljs-type">int</span>> storage;
set<pair<<span class="hljs-type">int</span>, <span class="hljs-type">int</span>>> orderSet;
<span class="hljs-keyword">public</span>: <span class="hljs-built_in">TLruCache</span>(<span class="hljs-type">int</span> sizeLimit) : <span class="hljs-built_in">maxSize</span>(sizeLimit) {}
<span class="hljs-function"><span class="hljs-type">void</span> <span class="hljs-title">Erase</span><span class="hljs-params">(<span class="hljs-type">int</span> key)</span> </span>{
<span class="hljs-keyword">if</span> (!storage.<span class="hljs-built_in">count</span>(key)) {
<span class="hljs-keyword">throw</span> <span class="hljs-built_in">runtime_error</span>(<span class="hljs-string">"key not found"</span>);
}
orderSet.<span class="hljs-built_in">erase</span>({lastAccess[key], key});
lastAccess.<span class="hljs-built_in">erase</span>(key);
storage.<span class="hljs-built_in">erase</span>(key);
}
<span class="hljs-function"><span class="hljs-type">void</span> <span class="hljs-title">Set</span><span class="hljs-params">(<span class="hljs-type">int</span> key, <span class="hljs-type">int</span> value)</span> </span>{
<span class="hljs-keyword">if</span> (storage.<span class="hljs-built_in">count</span>(key)) {
orderSet.<span class="hljs-built_in">erase</span>({lastAccess[key], key});
storage.<span class="hljs-built_in">erase</span>(key);
lastAccess.<span class="hljs-built_in">erase</span>(key);
}
<span class="hljs-keyword">if</span> (orderSet.<span class="hljs-built_in">size</span>() == maxSize) {
<span class="hljs-keyword">auto</span> [_, evictKey] = *orderSet.<span class="hljs-built_in">begin</span>();
<span class="hljs-built_in">Erase</span>(evictKey);
}
lastAccess[key] = timestamp++;
storage[key] = value;
orderSet.<span class="hljs-built_in">insert</span>({lastAccess[key], key});
}
<span class="hljs-function"><span class="hljs-type">int</span> <span class="hljs-title">Get</span><span class="hljs-params">(<span class="hljs-type">int</span> key)</span> </span>{
<span class="hljs-keyword">if</span> (!storage.<span class="hljs-built_in">count</span>(key)) {
<span class="hljs-keyword">throw</span> <span class="hljs-built_in">runtime_error</span>(<span class="hljs-string">"key not found"</span>);
}
orderSet.<span class="hljs-built_in">erase</span>({lastAccess[key], key});
lastAccess[key] = timestamp++;
orderSet.<span class="hljs-built_in">insert</span>({lastAccess[key], key});
<span class="hljs-keyword">return</span> storage[key];
}
}; </code></pre>