三行代码  ›  专栏  ›  技术社区  ›  Kenny

擦除(HAS1.FIX(p));没有调用“擦除”C++的匹配函数

  •  0
  • Kenny  · 技术社区  · 2 年前

    为什么它不接受hash1.find(p),但是hash1[p]工作,如果我使用它,它就会找到?

    class LRUCACHE {
        list<int> list1;   // store keys of Cache.
    
        unordered_map<int, list<int>::const_iterator> hash1;     // Store reference of Keys in Cache.
        int maxsize;
    
    public:
        LRUCACHE(int);
        void set(int);
        void get(int);
    };
    
    LRUCACHE::LRUCACHE(int n) {    
        maxsize = n;
    }
    
    
    void LRUCACHE::get(int x) {
        // Not Found in Cache.
        if (hash1.find(x) == hash1.end() ) {
    
            // if Max size.
            if (list1.size() == maxsize ) {
    
                // returns the last element of LIST.
                int last = list1.back();
    
                // Remove last element of LIST and reduce size by 1.
                list1.pop_back();
    
                hash1.erase(last); 
            }
        }
        else {
            list1.erase(hash1[x]);
        }
        list1.push_front(x);
        hash1[x] = list1.begin(); // points and updates.
    }
    
    void LRUCACHE::get(int p) {
        if (hash1.find(p) == hash1.end() ){
            cout << "not found " << endl;
        }
        else {
            list1.erase(hash1.find(p)); // Error Here member function not found
        }
    }
    
    

    我想我用常量迭代器来处理无序映射?所以它应该接受迭代器erase(const_迭代器位置)的list函数调用;

    我认为hash1.find应该返回const_迭代器?

    1 回复  |  直到 2 年前
        1
  •  0
  •   Yksisarvinen    2 年前

    std::unordered_map::find() 返回迭代器,而不是映射中的值。所以你得到的是 std::unordered_map<int, std::list<int>::const_iterator>>::iterator (或) std::unordered_map<int, std::list<int>::const_iterator>>::const_iterator )

    您可以使用 hash1.find(x)->second :

    void LRUCACHE::get(int p) {
        const auto iter = hash1.find(p);
        if (iter == hash1.end() ){
            cout << "not found " << endl;
        } else {
            list1.erase(iter->second); 
        }
    }
    

    std::unordered_map::operator[] 另一方面,它不返回迭代器,而是对键下映射中的值的引用。这意味着直接访问该值不需要进一步提取。