Подтвердить что ты не робот

Как проверить, находится ли строка в массиве строк

#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;
}

Я хочу проверить на С++, если строка n находится в массиве tab, но код возвращает ошибку. Что я делаю неправильно? Может быть, я должен использовать векторы?

4b9b3361

Ответ 1

int size = (*array).size();

Он не укажет размер array, он сообщает вам длину первой строки в этом массиве, вы должны передать длину массива функции отдельно. Функция должна выглядеть так:

bool in_array(string value, string *array, int length)

 

Но лучший выбор - использовать std::vector и std::find:

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

а затем вы можете использовать его как:

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

    if (in_array(n, tab)) {
        ...
    }
}

Ответ 2

При передаче массива в качестве аргумента функции, которая принимает только указатель, вы не можете запрашивать размер массива внутри функции (поскольку он преобразован в "глупую" указатель к первому элементу, не более). Обычно вы добавляете параметр "count" к вашей подписи или к итератору "end".

То, что вы пытаетесь реализовать, в основном std::find. Требуется два итератора (начало и конец последовательности) и элемент, который нужно найти. Просто используйте эту функцию.

std::find(std::begin(tab), std::end(tab), n);

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

Если вам не нравится "интерфейс итератора" для std-алгоритмов, вы можете достичь своей подписи под PHP, обернув вокруг std::find с помощью функции шаблона:

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);
}

Обратите внимание: этот ответ предполагает С++ 11. Если вы используете старый компилятор, он может не работать или работает, только если вы добавите -std=c++11 в флагов компилятора.