Сравнение символов по одному и тому же индексу двух строк

Я пытаюсь сравнить символы двух строк по заданному индексу. Однако я получаю следующую ошибку:

Line 9: Char 26: error: invalid operands to binary expression ('const __gnu_cxx::__alloc_traits<std::allocator<char>, char>::value_type' (aka 'const char') and 'const std::__cxx11::basic_string<char>')
                if (s[i] != letter) { return s.substr(0, i); }
                    ~~~~ ^  ~~~~~~

Вот мой код:

string longestCommonPrefix(vector<string>& strs) {
    auto comp = [](const string& a, const string& b) { return a.size() < b.size(); };
    const auto smallest = min_element(strs.begin(), strs.end(), comp);
    for (int i = 0; i < smallest->size(); ++i) {
        const auto letter = smallest[i];
        for (const auto& s : strs) {
            if (s[i] != letter) { return s.substr(0, i); }  // <- error occurs here
        }
    }
    return smallest;
}

Может кто-нибудь объяснить, почему это не работает?

Тип smallest — это std::vector<std::string>::iterator, а не operator[].

Yksisarvinen 17.05.2022 18:10
станд:: несоответствие может выполнять всю работу, которую пытается выполнить ваш цикл for.
PaulMcKenzie 17.05.2022 18:14

@PaulMcKenzie Спасибо, я посмотрю на эту функцию!

Nikolas 17.05.2022 18:20
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
0
3
44
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

В вашем коде smallest является

std::vector<std::string>::iterator const

который является итератором произвольного доступа, поэтому предоставляет operator[].

Однако,

smallest[i]

эквивалентно

*(smallest + i)

поэтому он вернет ссылку на i-ю строку после строки, на которую указывает smallest вместо i-го символа строки, на которую указывает smallest (это то, что вы хотите).

Чтобы получить i-й символ строки, на которую указывает smallest, вы должны сначала почтить его:

(*smallest)[i]

И вы также должны уважать это в заявлении return.


Кроме того, я рекомендую вам передать strs как ссылку на const и проверить, что smallest не является конечным итератором (что может произойти, если входной вектор пуст):

string longestCommonPrefix(vector<string> const& strs) {
    auto comp = [](const string& a, const string& b) {
        return a.size() < b.size();
    };

    const auto smallest = std::min_element(strs.begin(), strs.end(), comp);
    if (smallest == strs.end()) return "";

    for (int i = 0; i < smallest->size(); ++i) {
        const auto letter = (*smallest)[i];
        for (const auto& s : strs) {
            if (s[i] != letter) return s.substr(0, i);
        }
    }

    return *smallest;
}

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