Функция equal_range и лямбда выражения

55
14 июня 2018, 13:20

Есть необходимость найти в массиве строк диапазон строк, которые начинаются на определенную букву. Так как по умолчанию string и char не сравниваются, то пишем соответствующие функции сравнения. Как я понял их нужно две, так как с одной не работает. Вписываю их в структуру и получается что-то вроде:

struct Comp {
    bool operator()(const std::string &a, char b) {return a[0] < b;};
    bool operator()(char b, const std::string &a) {return b < a[0];};
}
std::equal_range(arr.begin(), arr.end(), pref, Comp{});

Мой вопрос вот в чем: а можно ли вместо этой структуры использовать лямбда-выражение?

Answer 1

Ну вот, например:

int main(int argc, const char * argv[])
{
    vector<string> v{"acv","asd","bcd","bsd","bxy","vsd","zxy" };
    auto [b,e] = equal_range(v.begin(),v.end(),'b',
                             [](auto x, auto y)
                             {
                                 if constexpr (sizeof(x) == 1)
                                 {
                                     return x < y[0];
                                 }
                                 else
                                 {
                                     return x[0] < y;
                                 }
                             });
    for(auto i = b; i != e; ++i)
        cout << *i << endl;
}

Можно воспользоваться более серьезной проверкой is_same, я взял что попроще :)

READ ALSO
Ценность дампов памяти

Ценность дампов памяти

Есть много утилит для всяких исследований кодаПрочитал несколько мнений на счёт того что выявление бага кода лучше делать через такие инструменты

47
Замена символов в строке(c++)

Замена символов в строке(c++)

Код который должен заменять символы, но он выдает ошибку

28
Загрузка файла с интернета

Загрузка файла с интернета

Хочу сделать загрузку файла по ссылке (пример - http://examplecom/test

44