Разработка и внедрение структуры данных для кэша наименее используемого (LRU). Он должен поддерживать следующие операции: get и set.карта с ошибкой сегментации класса
get (key) - Получить значение (всегда будет положительным) ключа, если ключ существует в кеше, в противном случае возвращает -1. set (ключ, значение) - установите или вставьте значение, если ключ еще не присутствует. Когда кеш достигнет своей емкости, он должен аннулировать последний использованный элемент перед вставкой нового элемента.
#include <iostream>
#include <map>
using namespace std;
struct node{
int val;
struct node* next;
struct node* prev;
};
class dlist{
public:
dlist(){}
dlist(int capacity){
cap=capacity;
}
void add(int value){
node* n=new node;
n->val=value;
if (size==0){
size++;
tail=n;
head=tail;
}
else {
if (size==cap){
node* buf=head;
head=head->next;
head->prev=NULL;
delete buf;
size--;
}
tail->next=n;
n->prev=tail;
tail=n;
size++;
}
}
int getVal(){
if (tail==NULL)
return -1;
return tail->val;
}
private:
int cap;
int size;
node* tail;
node* head;
};
class LRUCache{
public:
LRUCache(int capacity) {
cap=capacity;
}
int get(int key) {
if(cap!=0&&cache.find(key)!=cache.end())
return cache[key].getVal();
return -1;
}
void set(int key, int value) {
if (cap==0)
return;
if(cache.find(key)==cache.end()){
dlist d=dlist(cap);
cache.insert(make_pair(key,d));
}
cache[key].add(value);
}
private:
int cap;
map<int,dlist> cache;
};
int main()
{
LRUCache lru(3);
cout<<"asd";
lru.set(1,9);
lru.set(1,8);
lru.set(1,1);
lru.set(1,7);
lru.set(2,9);
cout<<lru.get(1)<<endl;
cout<<lru.get(2)<<endl;
cout<<lru.get(3)<<endl;
return 0;
}
поэтому я использовал карту и пользовательские двойной связанный список, это, кажется, работает нормально, если я с добавить COUT строку сразу после инициализации LRU, но она будет иметь сегментный вина, если у меня нет, я и не очень уверен, что мне следует делать, чтобы управлять использованием памяти LRU (если это проблема)
Также, если есть какая-либо строка, которая может быть лучше написана (кроме пространства имен std), пожалуйста, скажите мне, я был бы очень признателен за то, что ,
Пожалуйста, научитесь форматировать Ваш код правильно. Это заставит людей не хотеть выколоть глаза с ржавой ложкой. – Levi
. Вы не должны хранить самые последние значения, которые имели каждый ключ, вы должны хранить самые последние использованные ключи и их значения. Когда кеш достигает своей емкости, вы должны выбросить самую старую (ключ, значение) пару. – molbdnilo
То есть 'LRUCache lru (1); lru.set (1,9); lru.set (2,9); cout << lru.get (1); 'должен печатать' -1'. – molbdnilo