如何检查字符串是否在字符串数组中

use*_*705 17 c++ arrays string

#include <iostream>
#include <string>
using namespace std;

bool in_array(string value, string *array)
{
    int size = (*array).size();
    for (int i = 0; i < size; i++)
    {
        if (value == array[i])
        {
            return true;
        }
    }

    return false;
}

int main() {
    string tab[2] = {"sdasd", "sdsdasd"};
    string n;
    cin >> n;
    if (in_array(n, tab)) {

    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我想检查C++,如果n字符串在tab数组中,但代码返回错误.我做错了什么?也许我应该使用向量?

mas*_*oud 26

int size = (*array).size();
Run Code Online (Sandbox Code Playgroud)

它不会告诉你它的大小array,它告诉你该数组中第一个字符串的长度,你应该将数组的长度分别传递给该函数.该函数应如下所示:

bool in_array(string value, string *array, int length)
Run Code Online (Sandbox Code Playgroud)

 

但更好的选择是使用std::vectorstd::find:

bool in_array(const std::string &value, const std::vector<string> &array)
{
    return std::find(array.begin(), array.end(), value) != array.end();
}
Run Code Online (Sandbox Code Playgroud)

然后,你可以使用它像:

int main() {
    std::vector<std::string> tab {"sdasd", "sdsdasd"};

    if (in_array(n, tab)) {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

  • +1 用于推荐向量和使用 find 而不是重新发明轮子 (3认同)

lee*_*mes 5

将数组作为参数传递给只接受指针的函数时,您无法查询函数中数组的大小(因为它已转换为指向第一个元素的"愚蠢"指针,仅此而已).您通常会在签名或"结束"迭代器中添加"count"参数.

你基本上想要实现的是什么std::find.它需要两个迭代器(序列的开始和结束)和要找到的元素.只需使用此功能.

std::find(std::begin(tab), std::end(tab), n);
Run Code Online (Sandbox Code Playgroud)

如果找到它将返回一个迭代器,否则返回结束迭代器.检查与end迭代器的相等性将告诉您是否在数组中找到了该元素.

如果你不喜欢std算法的"迭代器接口",你可以std::find通过使用模板函数来实现类似PHP的签名:

template<class Element, class Container>
bool in_array(const Element & element, const Container & container)
{
    return std::find(std::begin(container), std::end(container), element)
            != std::end(container);
}
Run Code Online (Sandbox Code Playgroud)

请注意:这个答案假设是C++ 11.如果使用较旧的编译器,它可能不起作用,或者仅在添加-std=c++11到编译器标志时才起作用.