Использование лямбда-выражения в качестве сравнения для std :: set, когда оно находится внутри вектора

Я хочу использовать лямбда-выражение как пользовательское сравнение для набора целых чисел std ::. На этом сайте есть много ответов, объясняющих, как это сделать, например https://stackoverflow.com/a/46128321/10774939. И действительно,

#include <vector>
#include <set>
#include <iostream>

int main() {

    auto different_cmp = [](int i, int j) -> bool {
        return j < i;
    };

    std::set<int, decltype(different_cmp)> integers(different_cmp);

    integers.insert(3);
    integers.insert(4);
    integers.insert(1);
    for (int integer : integers) {
        std::cout << integer << " ";
    }

    return 0;
}

компилирует и выводит

4 3 1

как и ожидалось. Однако, когда я пытаюсь поместить этот набор в вектор с

    std::vector<std::set<int, decltype(different_cmp)>> vec_of_integers;
    vec_of_integers.push_back(integers);

компилятор жалуется. Я использую Visual Studio 2017 и получаю разные ошибки компилятора в зависимости от окружающего кода. В приведенном выше примере это

1>c:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.16.27023\include\utility(77): error C2664: 'void std::swap(std::exception_ptr &,std::exception_ptr &) noexcept': cannot convert argument 1 from '_Ty' to 'std::exception_ptr &'
1>        with
1>        [
1>            _Ty=main::<lambda_48847b4f831139ed92f5310c6e06eea1>
1>        ]

Большинство ошибок, которые я видел до сих пор, похоже, связаны с копированием набора.

Итак, мой вопрос:

Why does the above code not work and how can I make it work, while still using a locally defined lambda?

Я не могу воспроизвести вашу ошибку. Пожалуйста, предоставьте полный пример, который мы можем скопировать и вставить в наш компилятор.

DeiDei 11.12.2018 11:08

Репродукция: godbolt.org/z/SgVU58

YSC 11.12.2018 11:29

На самом деле это всего лишь приведенный выше код плюс две строки std :: vector <std :: set <int, decltype (different_cmp) >> vec_of_integers; vec_of_integers.push_back (целые числа); вставлен прямо перед возвратом 0. Как уже ответили другие, похоже, что это ошибка, специфичная для MS-компилятора.

x432ph 11.12.2018 11:45
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
5
3
933
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это похоже на ошибку в компиляторе MS, поскольку он хорошо компилируется с GCC и Clang.

Чтобы он работал в MS Compiler (Visual Studio 2017), вы можете сделать это:

std::vector<std::set<int, decltype(different_cmp)>> vec_of_integers{integers};

Это компилируется чисто. См. здесь.

Ааа, опять же, MS-компилятор, почему !?

x432ph 11.12.2018 11:44

@ x432ph: Ага. Сам сегодня я столкнулся с тремя вопросами, связанными с ошибками компилятора MS.

P.W 11.12.2018 11:45

В реальном коде, который я пытаюсь отлаживать, мне нужно создать вектор переменной длины. Есть ли способ сделать это, не вызывая ошибки?

x432ph 11.12.2018 11:48

@ x432ph: Может, стоит попробовать комбинацию resize и vector.at(index) = x.

P.W 11.12.2018 11:53

Хорошая идея, но теперь ошибка возникает в других местах, где я пытаюсь изменить наборы уже в векторе. К сожалению, я полагаю, что мне нужно создать собственную реализацию дерева поиска, чтобы оно надежно работало для моих целей.

x432ph 11.12.2018 12:17

Другие вопросы по теме