Как проверить есть ли символ в строке c
Перейти к содержимому

Как проверить есть ли символ в строке c

Найти, содержит ли строка символ в C ++ (разрешено повышение)

Предположим, у меня есть строка, и я хочу выяснить, присутствует ли определенный символ (например, ‘|’) или нет, каков наилучший и быстрый способ сделать это? Я знаю реализацию поиска строки. Я прошу еще более быструю реализацию, чем эта.

6 ответов

Вряд ли что-то более эффективное. O (N) это лучшее, что вы можете сделать. Реализация стандартной библиотеки должна быть в значительной степени оптимальной.

Добавление ответа Тома Таннера. Если вы не хотите делать какие-либо априорные вычисления, вы застрянете в O (n), то есть существует линейная корреляция между длиной искомой строки и потреблением времени. Том предложил установить массив (или вектор) логических значений, которые указывают, произошел ли определенный символ. Для индексации строки потребуется O (n) один раз, но затем вы можете проверить наличие любого количества символов в O (1) (постоянное время), если оно включено. Недостатком этого подхода является то, что вам потребуется много памяти (как только вы решите, что вам нужно поддерживать Unicode).

В качестве компромисса вы можете использовать std :: set или аналогичный, сохраняя только те символы, которые действительно существуют в вашей входной строке. В этом случае потребление памяти будет примерно линейным в зависимости от количества различных символов в строке, но поиск будет O (log n), то есть логарифмический по времени.

Конечно, вы должны измерить /профиль, а затем объяснить, какой вариант использования вы на самом деле оптимизируете. Пока вы этого не сделаете, придерживайтесь того, что легче всего понять и прочитать.

Другой способ — использовать функцию strchr в соответствующей строке c_str:

Не уверен, как он сравнивается с std find с точки зрения скорости .

Положение найденного символа:

Из этого источника эмпирического теста, выполненного с Компилятор Visual Studio 2013 показывает, что подпрограмма strchr примерно на в 2 раза быстрее , чем реализация std :: string :: find .

Есть только один способ сделать это. Просто переберите строку, чтобы проверить, существует ли искомый символ. Вы можете сделать это с помощью функции string::find , которая получает символ и возвращает первую позицию в строке, или string::npos , если значение отсутствует. Вы также можете использовать std::find , который получает два итератора, begin и end и значение ключа ‘k’ и возвращает итератор, указывающий на первое вхождение k в диапазоне [begin, end] или end if k не найдено. И, конечно, вы можете самостоятельно реализовать функцию поиска, например так:

Подробнее о std::string::find и std::find :

  • http://www.cplusplus.com/reference/string/string/find /
  • http://www.cplusplus.com/reference/algorithm/find/

Учитывая ваше утверждение, что вы хотите что-то быстрее, чем string :: find, единственное, о чем я могу подумать, это создать класс, который имеет сильно настроенные операторы присваивания, которые при каждом обновлении строки обновляли внутреннюю таблицу, содержащую первая позиция в строке каждого возможного символа (256 для строки символов, 65536 (?) для широкой строки). Это имеет O (1) поиск за счет довольно большой сложности, добавленной к неконстантным операциям.

Как проверить, существует ли какой-нибудь определённый символ в строке?

user avatar

Всё ещё ищете ответ? Посмотрите другие вопросы с метками c++ или задайте свой вопрос.

Site design / logo © 2022 Stack Exchange Inc; user contributions licensed under cc by-sa. rev 2022.6.10.42345

Нажимая «Принять все файлы cookie», вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.

Как я могу проверить, содержит ли строка символ в C#?

есть ли функция, которую я могу применить к строке, которая вернет true из false, если строка содержит символ.

у меня есть строки с одним или более символа опции, такие как:

то, что я хотел бы сделать, например, иметь функцию, которая возвращала бы true или false, если выше содержал нижний или верхний регистр «s».

также В C# мне нужно проверить, действительно ли что-то такое, Или я могу просто удалить «== true» ?

8 ответов

вы можете использовать метод расширения .Contains() из пространства имен System.В LINQ:

и нет, чтобы проверить, является ли логическое выражение истинным, вам не нужно == true

С Contains метод является методом расширения, мое решение, по-видимому, смущает некоторых. Вот две версии, которые не требуют добавления using System.Linq; :

обновление

если вы хотите, вы можете написать свой собственный метод расширений для более легкого повторного использования:

затем вы можете назвать это так:

в большинстве случаев при работе с пользовательскими данными вы действительно хотите использовать CurrentCultureIgnoreCase (или ContainsAnyCase метод расширения), потому что таким образом вы позволяете системе обрабатывать проблемы верхнего/нижнего регистра, которые зависят от языка. При решении вычислительных проблем, таких как имена тегов HTML и т. д., Вы хотите использовать инвариантную культуру.

для пример: на турецком языке заглавная буква I в нижнем регистре ı (без точки), а не i (с точкой).

можно использовать IndexOf метод, который имеет подходящую перегрузку для типов сравнения строк:

кроме того, вам не понадобится == true , так как оператор if ожидает только выражение, которое оценивается как bool .

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *