Строковый массив для функции C++

Я хочу проверить, находится ли данное имя внутри массива возможных имен. Я написал эту маленькую функцию отладки (да... я знаю, что она всегда возвращает true), пытаясь понять, почему она не работает и почему я получаю ошибку ниже.

Код

char[] people_names = ["Mario","Luigi"];

bool lookupTerm (string term, string possible_names[]){
   for(const string &possible_name : possible_names)
     cout << possible_name <<  endl;

    return true;
}

ошибка

jdoodle.cpp: In function 'bool lookupTerm(std::__cxx11::string, std::__cxx11::string*)':
jdoodle.cpp:19:38: error: no matching function for call to 'begin(std::__cxx11::basic_string<char>*&)'

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

1 ответ

Решение

Проблема в том, что когда вы передаете массив функции, он распадается на указатель на свой первый элемент.

Неважно, если вы попытаетесь объявить аргумент как массив, компилятор все равно преобразует его как указатель. string possible_names[] равно string* possible_names когда вы объявляете аргументы.

Простое решение состоит в том, чтобы использовать либо std::vector или же std::array в зависимости от ваших потребностей и варианта использования.

С помощью std::vector ваш код будет выглядеть примерно так:

std::vector<std::string> people_names = { "Mario", "Luigi" };

bool lookupTerm(const std::string& term, const std::vector<std::string>& possible_names) {
    for (const std::string &possible_name : possible_names)
    {
        if (possible_name == term)
            return true;
    }
    return false;
}

Одна строка с использованием std::find:

bool lookupTerm(const std::string& term, const std::vector<std::string>& possible_names) {
    return std::find(possible_names.begin(), possible_names.end(), term) != possible_names.end();
}

Если производительность становится проблемой, вы можете увеличить производительность, используя отсортированный вектор (используя std::sort) а также std::lower_bound:

//at one point:
std::sort(people_names.begin(), people_names.end());

bool lookupTerm(const std::string& term, const std::vector<std::string>& sorted_possible_names) {
    //sorted_possible_names must be always sorted when you call this!
    auto i = std::lower_bound(sorted_possible_names.begin(), sorted_possible_names.end(), term);
    return (i != sorted_possible_names.end() && *i == term);
}
Другие вопросы по тегам