Как проверить, находится ли строка в массиве строк
#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, но код возвращает ошибку.
Что я делаю неправильно? Может быть, я должен использовать векторы?
Ответы
Ответ 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
в флагов компилятора.