字符串数组到C ++函数

时间:2018-03-21 15:54:53

标签: c++ arrays compare lookup

我想检查给定名称是否在可能名称数组中。我写了这个小调试函数(是的......我知道它总是返回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 个答案:

答案 0 :(得分:3)

问题在于,当您将数组传递给函数时,它会衰减到指向其第一个元素的指针。

如果您尝试将参数声明为数组并不重要,编译器仍会将其转换为指针。当你声明参数时,string possible_names[]等于string* possible_names

简单的解决方案是使用std::vectorstd::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);
}