Я пытаюсь внедрить код C ++ для проблемы. В этой проблеме кэш использует наименьшую недавно используемую политику, например, если кэш имеет емкость для хранения 5 клавиш, таких как 5 3 2 1 4 , то если следующий ключ = 1 поступает в качестве удара, порядок кэша становится 1 5 3 2 4 . Если Next Key = 6 поступает в качестве пропуска, порядок кэша становится 6 1 5 3 2 .
Code, который я написал ниже, работает для тестирования 1 и его вывода, но не для тестового примера 2 и его вывода. Я показал свой код, входы и выходы ниже. Я не хочу решение с использованием связанного списка, хотя. < /P>
код: < /p>
#include
#include
#include
#include
using namespace std;
struct Node {
int value, key;
Node (int k,int v):value(v),key(k){};
}typedef Node;
class Cache{
protected :
list l;
map mp;
int cp;
virtual void set(int,int) =0;
virtual int get(int)=0;
}typedef Cache;
class LRUCache:public Cache{
void removeback(){
mp.erase(--l.end()->key);
l.pop_back();
}
void addatfront(int k, int v) {
Node *node = new Node(k,v);
if (mp.size() == cp)
removeback();
//l.push_front({k,v});
l.push_front(*node);
mp[k] = l.begin()
}
void movetohead(list::iterator arg, int new_val){
(*arg).value = new_val;
l.splice(l.begin(),l,arg);
mp[arg->key]= l.begin();
}
public:
LRUCache(int &cap){
cp = cap;
}
void set(int k,int v){
if (mp.find(k)!=mp.end()){
if (mp.size()>1)
movetohead(mp[k],v);
else
l.begin()->value = v;
}
else
addatfront(k,v);
}
int get (int k){
if (mp.find(k)!=mp.end())
return mp[k]->value;
return -1;
}
}typedef LRUCache;
int main()
{
int n, capacity,i;
cin>> n>> capacity;
LRUCache l(capacity);
for (i =0;i< n;i++){
string command;
cin>> command;
if (command == "get"){
int key;
cin >> key;
cout key>>value;
l.set(key, value);
}
}
return 0;
}
< /code>
Тестовый пример ввода 1: < /p>
3 1
set 1 2
get 1
get 2
< /code>
output: < /p>
2
-1
< /code>
Тестовый пример ввода 2: < /p>
22 4
set 7 1905
get 16
get 4
set 20 1738
get 14
set 12 320
set 4 1382
set 11 1049
set 8 1372
get 11
set 7 937
set 9 654
set 11 1727
get 1
set 13 1945
get 5
get 15
set 6 1668
set 8 270
set 1 604
get 20
get 5`
< /code>
output: < /p>
-1
-1
-1
1049
-1
-1
-1
1738
-1
Подробнее здесь: https://stackoverflow.com/questions/797 ... red-output
Ключ карты к узлу в STD :: List в C ++. Не могу получить обязательный выход ⇐ C++
Программы на C++. Форум разработчиков
1758006907
Anonymous
Я пытаюсь внедрить код C ++ для проблемы. В этой проблеме кэш использует наименьшую недавно используемую политику, например, если кэш имеет емкость для хранения 5 клавиш, таких как 5 3 2 1 4 , то если следующий ключ = 1 поступает в качестве удара, порядок кэша становится 1 5 3 2 4 . Если Next Key = 6 поступает в качестве пропуска, порядок кэша становится 6 1 5 3 2 .
Code, который я написал ниже, работает для тестирования 1 и его вывода, но не для тестового примера 2 и его вывода. Я показал свой код, входы и выходы ниже. Я не хочу решение с использованием связанного списка, хотя. < /P>
код: < /p>
#include
#include
#include
#include
using namespace std;
struct Node {
int value, key;
Node (int k,int v):value(v),key(k){};
}typedef Node;
class Cache{
protected :
list l;
map mp;
int cp;
virtual void set(int,int) =0;
virtual int get(int)=0;
}typedef Cache;
class LRUCache:public Cache{
void removeback(){
mp.erase(--l.end()->key);
l.pop_back();
}
void addatfront(int k, int v) {
Node *node = new Node(k,v);
if (mp.size() == cp)
removeback();
//l.push_front({k,v});
l.push_front(*node);
mp[k] = l.begin()
}
void movetohead(list::iterator arg, int new_val){
(*arg).value = new_val;
l.splice(l.begin(),l,arg);
mp[arg->key]= l.begin();
}
public:
LRUCache(int &cap){
cp = cap;
}
void set(int k,int v){
if (mp.find(k)!=mp.end()){
if (mp.size()>1)
movetohead(mp[k],v);
else
l.begin()->value = v;
}
else
addatfront(k,v);
}
int get (int k){
if (mp.find(k)!=mp.end())
return mp[k]->value;
return -1;
}
}typedef LRUCache;
int main()
{
int n, capacity,i;
cin>> n>> capacity;
LRUCache l(capacity);
for (i =0;i< n;i++){
string command;
cin>> command;
if (command == "get"){
int key;
cin >> key;
cout key>>value;
l.set(key, value);
}
}
return 0;
}
< /code>
Тестовый пример ввода 1: < /p>
3 1
set 1 2
get 1
get 2
< /code>
output: < /p>
2
-1
< /code>
Тестовый пример ввода 2: < /p>
22 4
set 7 1905
get 16
get 4
set 20 1738
get 14
set 12 320
set 4 1382
set 11 1049
set 8 1372
get 11
set 7 937
set 9 654
set 11 1727
get 1
set 13 1945
get 5
get 15
set 6 1668
set 8 270
set 1 604
get 20
get 5`
< /code>
output: < /p>
-1
-1
-1
1049
-1
-1
-1
1738
-1
Подробнее здесь: [url]https://stackoverflow.com/questions/79765807/map-key-to-the-node-in-stdlist-in-c-cant-get-required-output[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия