C2100非法间接比较器和集合

时间:2016-11-12 04:14:16

标签: c++ set

我试图按值而不是键对集合进行排序。我一直遇到非法的间接问题。每次我尝试通过LRU缓存插入时都会发生错误。我认为问题与不使用指针有关,所以我将a和b转换为指针,但它没有工作。

struct comp {
    bool operator ()(const pair<int, int>& a, const pair<int, int>& b) {
        return a.second < b.second;
    }
};
typedef set<pair<int, int>, comp> S;

struct LRUCache {
    S cache;
    typedef S::iterator it;
    int cap;

    LRUCache(int capacity) {
        cap = capacity;
    }

    int get(int key) {

    }

    void setC(int key, int value) {
        cache.insert(key, value);
    }

    void initialize() {
        vector<int> temp{ 5,20,35,20,83,17,5,1,0,239,242,42 };
        for (int i = 0; i < temp.size(); i++) {
            setC(i, temp[i]);

        }
    }

};

int main()
{
    LRUCache test(5);
    test.initialize();
    test.setC(1, 5);
    test.setC(12, 20);
    return 0;
}

1 个答案:

答案 0 :(得分:0)

问题是,您的std::setstd::pair<int, int>组成,并且您没有使用此行将该类型插入到您的集合中:

cache.insert(key, value);

这会调用带有两个参数的set::insert函数,编译器会尝试匹配您使用one of the overloads here that takes two parameters传递的两个int值。

相反,您要做的是使用单个参数调用set::insert,即std::pair<int, int>

将以上行更改为:

cache.insert({key, value});

cache.insert(std::make_pair(key, value));

Live Example

如果您对using使用typedefstd::pair,您也可以更清楚地看到问题。

typedef std::pair<int, int> IntPair;
typedef std::set<IntPair, comp> PairSet;
//...
PairSet cache;
//...
cache.insert(IntPair(key, value));

您知道要将IntPair插入到集合中,因此上面的代码编译时没有问题。