вектор пары множества с лямбда-компаратором - PullRequest
1 голос
/ 01 апреля 2020

Я пытаюсь создать вектор из пары множеств: vector<pair<set<int>, set<int>>>, но я хочу использовать разные лямбда-компараторы для двух множеств. Я попытался сделать:

#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.

Кроме того, есть ли способ инициализировать размер вектора? Пожалуйста, помогите.

1 Ответ

2 голосов
/ 01 апреля 2020

Вы пытаетесь передать свои лямбды в конструктор внешнего vector, у которого нет конструкторов, которые принимают лямбда-выражения в качестве входных данных.

Вместо этого вам нужно передать лямбда-выражения в конструктор std::set, это означает, что вам нужно создать отдельные std::set экземпляры (см. C ++ 11 std :: set лямбда-функция сравнения ) и затем вывести их sh в вектор, например:

#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, поэтому вы не сможете передать им свои лямбды. Если вы хотите, используйте вместо этого функторы без сохранения состояния:

#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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...