首页 > 解决方案 > 带有 lambda 比较器的集合对的向量

问题描述

我正在尝试制作一组​​成对的向量:vector<pair<set<int>, set<int>>>但我想为这两组使用不同的 lambda 比较器。我试着做:

#include <bits/stdc++.h>
using namespace std;

int main() {
    auto cmp = [&] (int a, int b) -> bool {
        return a > b;
    };
    auto hi = [&] (int a, int b) -> bool {
        return a < b;
    };
    vector<pair<set<int, decltype(cmp)>, set<int, decltype(hi)>>> lol(cmp, hi);
    return 0;
}

但它给了我这个错误:

test.cpp:11:75: error: no matching function for call to ‘std::vector<std::pair<std::set<int, main()::<lambda(int, int)> >, std::set<int, main()::<lambda(int, int)> > > >::vector(main()::<lambda(int, int)>&, main()::<lambda(int, int)>&)’
 ype(cmp)>, set<int, decltype(hi)>>> lol(cmp, hi);
                                                ^
compilation terminated due to -Wfatal-errors.

另外,还有什么方法可以初始化向量的大小吗?请帮忙。

标签: c++vectorset

解决方案


您正在尝试将 lambdas 传递给 external 的构造函数,该构造vector函数没有将 lambdas 作为输入的构造函数。

您需要将 lambdas 传递给std::set构造函数,这意味着您需要构造单个std::set实例(请参阅C++11 std::set lambda comparison function),然后将它们推送到向量中,例如:

#include <vector>
#include <set>
#include <utility>
using namespace std;

auto cmp = [] (int a, int b) -> bool {
    return a > b;
};

auto hi = [] (int a, int b) -> bool {
    return a < b;
};

using set_cmp = set<int, decltype(cmp)>;
using set_hi = set<int, decltype(hi)>;
using set_pair = pair<set_cmp, set_hi>;

int main()
{
    vector<set_pair> lol;
    ...
    lol.push_back(make_pair(set_cmp(cmp), set_hi(hi)));
    ...
    return 0;
}

这意味着您将无法预先调整向量的大小,因为它需要能够默认构造set对象,因此您无法将 lambdas 传递给它们。如果需要,请改用无状态函子:

#include <vector>
#include <set>
#include <utility>
using namespace std;

struct cmp {
    bool operator()(int a, int b) const {
        return a > b;
    }
};

struct hi {
    bool operator()(int a, int b) const {
        return a < b;
    }
};

using set_cmp = set<int, cmp>;
using set_hi = set<int, hi>;
using set_pair = pair<set_cmp, set_hi>;

int main()
{
    vector<set_pair> lol(...desired size...);
    ...
    return 0;
}

推荐阅读