Анимация
JavaScript
|
Главная Библионтека Функция Описание findJast of() Поиск последнего символа, входящего в value find first not of() Поиск первого символа, не входящего в value findJast not of() Поиск последнего символа, не входящего в value Все поисковые функции возвращают индекс первого символа последовательности, удовлетворяющей заданному условию. Если поиск завершается неудачей, все функции возвращают npos. Поисковые функции используют следующую схему передачи аргументов: О в первом аргументе всегда передается искомое значение; О второй аргумент определяет индекс, с которого должен начинаться поиск; О необязательный третий аргумент определяет количество символов в искомом значении. К сожалению, эта схема передачи аргументов отличается от схем, принятых в других строковых функциях, когда в первом аргументе передается начальный индекс, а значение и длина определяются соседними аргументами. Каждая строковая функция перегружается для перечисленных ниже аргументов. const strings value Поиск символов строки value. const strings value. size type 1dx Поиск символов строки value, начиная с позиции idx в строке *this. const char* value Поиск символов С-строки value. const char* value. size type idx Поиск символов С-строки value, начиная с позиции idx в строке *this. const char* value. size type idx. size type valuejen Поиск value l€n символов символьного массива value, начиная с позиции idx в строке *this. В этом случае символ \0 не имеет специальной интерпретации внутри value. const char value Поиск символа value. const char value. size type Idx Поиск символа value, начиная с позиции idx в строке *this. Пример: std::string SС"Hi Bill. Im ill. so please pay the bill"); s.find("il") Возвращает 4 (первая подстрока "il") idx - s.findCsubstring"): if (idx == Std::String::npos) { Условие команды if равно true в том и только в том случае, если строка s не содержит подстроку "substring". Будьте очень внимательны при использовании строкового значения npos и его типа. При проверке возвращаемых значений всегда имейте в виду тин возвращаемого значения string: :size type, но не int или unsigned; в противном случае сравнение возвращаемого значения с string::npos может не сработать. Такое поведение объясняется тем, что при проектировании библиотеки значение npos было определено как число -1: namespace std ( tempiate<class charT, class traits = char tra1ts<charT>. class Allocator = allocator<charT> > class basic string { public: typedef typename Allocator::size type size type; static const size type npos - -1; s.findC"1l".lO) Возвращает 13 (первая подстрока "il" лосле s[10]) s.rfindCil") Возвращает 37 (последняя подстрока "11") s.find first of("il") Возвращает 1 (первый из символов 1 или 1) s.f1nd last of("il") Возвращает 39 (последний из символов 1 или 1) s.find first not of("11") Возвращает О (первый символ. отличный от 1 и 1) s.flnd last not of("il") Возвращает проз При поиске символов и подстрок также используются алгоритмы STL, позволяющие задавать пользовательские критерии сортировки (пример приведен на с. 478). Обратите внимание на отличия в именах поисковых алгоритмов STL и поисковых функций строк. За дополнительной информацией обращайтесь на с. 322. Значение npos Если поиск не дает результатов, поисковые функции возвращают string: mpos. Рассмотрим следующий пример: std::string s; Std:istring::size type idx; Будьте внимательны: другие типы не подходят! К сожалению, тип sizejype (определяемый распределителем памяти строки) должен быть беззнаковым целым. Распределитель по умолчанию allocator использует в качестве size type тип size t (см. с. 706). Поскольку -1 преобразуется к беззнаковому целому типу, проз является максимальным беззнаковым значением этого типа. Тем не менее точное значение зависит от конкретного определения типа slze type. К сожалению, на практике максимальные значения оказываются различными. Более того, (unsigned long)-l отличается от (unsigned short)-l (если различаются размеры этих типов). Следовательно, показанное ниже условие может оказаться равным false, если переменная idx равна -1, а idx и string: :npos относятся к разным типам: 1dx =- std::str1ng::npos Пример: std::string s; Int idx " s.findCnot found"): Предположим, возвращается npos If (idx std::string::npos) { ОШИБКА: сравнение может не работать Один из способов предотвращения этой ошибки основан на прямой проверке результата поиска: if Cs.findChi") == std::string::npos) { 1 Однако довольно часто в программе нужен индекс позиции, в которой было найдено совпадение. Другое простое решение заключается в определении собственного знакового значения для npos: const int NPOS = -1; Сравнение принимает несколько иной (и даже более компактный) вид: if Cidx = NPOS) { Работает почти всегда К сожалению, это решение не идеально - проверка завершится неудачей, если idx относится к типу unsigned short или индекс превышает максимальное значение int (именно из-за этих проблем такое решение не было стандартизировано). Однако поскольку на практике обе ситуации встречаются очень редко, обычно это решение работает. Но если вы хотите, чтобы программа была действительно переносимой, всегда используйте тип string::s\ze type для всех индексов строковых типов. В идеальном решении вам придется определить перефу-женные функции в зависимости от конкретного типа string::s\zeJCYpe. Вероятно, в будущем в стандарте появится более удачное решение этой проблемы. 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 [ 153 ] 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 |