Найти равный диапазон для контейнера со строкой с префиксом - PullRequest
0 голосов
/ 14 апреля 2019

У меня есть 2 итератора range_begin, range_end, которые являются моим контейнером.Мне нужно найти все строки, которые начинаются с префикса char.Вот мой код:

template <typename RandomIt>
pair<RandomIt, RandomIt> FindStartsWith(
RandomIt range_begin, RandomIt 
range_end,char prefix){
auto it=equal_range(range_begin,range_end,prefix,
[prefix](const string& city){return city[0]==prefix;});
return it;}

Например, для

const vector<string> sorted_strings = {"moscow", "murmansk", "vologda"};
auto it=FindStartsWith(strings.begin(),strings.end(),'m');

я хочу получить итератор с первым на «москве» и последним после «мурманска».

Я получаю странные ошибки компилятора.Что не так и как я могу это решить? Я не могу написать правильный лямбда-компоратор.

Ответы [ 2 ]

2 голосов
/ 14 апреля 2019

equal_range ожидает функцию сравнения, которая принимает два параметра; Вы передаете функцию, принимающую ее.

Для гетерогенного вызова (тот, где тип value не совпадает с типом элементов в диапазоне) требуется функция сравнения, которая может принимать два типа в любом порядке. В этом случае лямбда не будет работать, так как имеет только одну operator() перегрузку.

Наконец, функция должна выполнять сравнение типа меньше , а не равно . Грубо говоря, equal_range возвращает диапазон от первого элемента, для которого !(element < value), до первого элемента, для которого value < element.

1 голос
/ 14 апреля 2019

Ваши ошибки могут быть связаны с strings.begin () и .end (), которые не имеют sorted_ . Я не думаю, что вы также должны использовать шаблон. Помимо ошибок, я рекомендую использовать другую стандартную функцию. Более простое решение - использовать foreach:

#include <algorithm>
#include <iterator>
#include <list>
#include <string>
#include <utility>
#include <vector>

typedef std::vector<std::string>::const_iterator RandomIt;

std::vector<std::string> FindStartsWith(RandomIt start, RandomIt end, const char prefix) {
    std::vector<std::string> result;

    std::for_each(start, end, [&](auto city) {
        if (city.front() == prefix) {
          result.push_back(city);
        }
    });

    return result;
}

int main(int argc, char* argv[]) {
    const std::vector<std::string> sorted_strings = { "moscow", "murmansk", "vologda" };
    auto prefix_cities = FindStartsWith(sorted_strings.begin(), sorted_strings.end(), 'm');

    return 0;
}

Определенно можно использовать рефакторинг, но я предполагаю, что вам нужно реализовать его в FindStartsWith по какой-то другой причине ...

Спасибо за публикацию, это многому меня научило в equal_range:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...