(C ) Более простой способ сравнить значение с каждым элементом массива с помощью оператора OR?

#c #arrays #sorting #compare #operators

#c #массивы #сортировка #Сравнить #операторы

Вопрос:

Я пытаюсь создать калькулятор на c с использованием классов, и я столкнулся с этой проблемой. вот код: (сейчас это не проблема, но я вижу, что она станет проблемой в будущем)

 char opcheck;
char opDisp[6] = { ' ', '-', '*', '/', 'p', 'r' };

while (opcheck==opDisp[0] || opcheck==opDisp[1] || opcheck==opDisp[2] || opcheck==opDisp[2] || opcheck==opDisp[4] || opcheck==opDisp[5]);
  

Итак, моя проблема связана с этим оператором while; как я могу сравнить переменную opcheck с каждым элементом массива opDisp, НЕ вводя «opcheck==opDisp [n]» для каждого элемента?

Есть ли в C вообще какая-либо встроенная функция массива, например «if(opcheck==opDisp[от 1 до 5 с оператором OR каждый раз])»?

Комментарии:

1. Сделайте это структурой и определите operator= элемент.

Ответ №1:

Вы можете использовать any_of стандартные алгоритмы начиная с C 11:

 if (std::any_of(std::cbegin(opDisp), std::cend(opDisp), [=](char x) { return x == opcheck; })) {
    ...
}
  

Или в C 20 с std::ranges :

 if (std::ranges::any_of(opDisp, [=](auto x) { return x == opcheck; })) {
    ...
}
  

Ответ №2:

Вы можете использовать std::find

 while (std::find(std::begin(opDisp), std::end(opDisp), opcheck) != std::end(opDisp))
  

Комментарии:

1. Но почему он проверяет, не равно ли значение, которое я нашел с помощью std::find, концу массива? Я не совсем знаком с этим…

2. std::find возвращает итератор первого найденного элемента или конец, если не найден.

Ответ №3:

Вы не спрашивали (об эффективности), но ОБЯЗАТЕЛЬНО ли использовать массив? Любой поиск в массиве будет иметь линейную сложность. Если вы сохраняете свои операторы в unordered_set (хэш-таблице), поиск будет иметь постоянную сложность, и то же std::find самое будет работать, только быстрее.

Комментарии:

1. Итак, рекомендуется ли всегда использовать неупорядоченный набор, когда вам не нужно, чтобы значения внутри контейнера располагались в определенном порядке?

2. @SorenTheOutcast Вы используете упорядоченные коллекции, если вас интересует порядок их элементов, и неупорядоченные — если вы этого не делаете. Это относится и к map and unordered_map .