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

202
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
Ценность дампов памяти

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

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

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

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

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

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

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

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

233