#include #include #include #include class Ideal_Cache { private: int capacity; std::vector cache; std::unordered_map cacheMap; // Для быстрого доступа к индексам public: Ideal_Cache(size_t capacity) : capacity(capacity) {} int tic_number = 0; void get_request_vector(const std::vector& requests) { // смотрим есть ли айди в кэше // Есть - тик // Нет - смотрим размер, если размер не полный добавляем в кэш // если размер полный, то уберем тот, который позже всех встретится for (size_t i = 0; i < requests.size(); ++i) { int item = requests[i]; if (cacheMap.find(item) != cacheMap.end()) { tic_number++; //tic continue; } if (cache.size() < capacity) { cache.push_back(item); cacheMap[item] = cache.size() - 1; } else { int farthest = -1; int indexToRemove = -1; for (size_t j = 0; j < cache.size(); ++j) { auto nextIndex = std::find(requests.begin() + i, requests.end(), cache[j]); //находим следующее вхождение (начиная с i ого тк предыдущие обработались) if (nextIndex == requests.end()) { indexToRemove = j; //В конце удалим последний break; } else { int nextIdx = std::distance(requests.begin(), nextIndex); if (nextIdx > farthest) { farthest = nextIdx; indexToRemove = j; } } } cacheMap.erase(cache[indexToRemove]); cache[indexToRemove] = item; cacheMap[item] = indexToRemove; } } } void info() const { std::cout << "ideal cache: "; for (int item : cache) { std::cout << item << " "; } std::cout << std::endl; } };