Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Строки стандартного класса string↑ Стр 1 из 10Следующая ⇒ Содержание книги
Поиск на нашем сайте
Строки стандартного класса string В любой программе, кроме операторов языка, используются средства библиотек, включаемых в среду программирования. Компиляторы Microsoft Visual C++ содержат библиотеки классов для написания приложений Windows. Часть библиотек стандартизована, т.е. должна поставляться с любым компилятором языка. Стандартную библиотеку С++ можно условно разделить на две части. К первой относятся функции, макросы, типы и константы, унаследованные из библиотеки С, а ко второй – классы, шаблоны и другие средства С++ для ввода, вывода, хранения и обработки данных как стандартных типов, так и типов, определенных пользователем. В классах можно выделить несколько групп в соответствии с их назначением. Потоковые классы (мы их уже рассматривали) предназначены для управления потоками данных между оперативной памятью и внешними устройствами (дисками, консолью и т.д.), а также в пределах оперативной памяти. Строковый класс string предназначен для удобной и защищенной от ошибок работы с символьными строками. Рассмотрим работу с ним более подробно. Операции Для объектов класса string допустимы операции
Для строк класса string (в отличие от строк старого стиля) &s[0] не равно s. Методы класса string
size_type – синоним типа unsigned int, определенного в пространстве имен std; npos – константа, определенная в string, задающая максимально возможное число Примеры использования методов строк-объектов Примеры работы со строками разных типов #include <cstring> #include <string> //строковый класс
int main() { char c1[80], c2[80], c3[80]; //строки с завершающим нулем string s1, s2, s3; //строки-объекты
//копирование строк strcpy (c1,"old string one "); //дает warning C4996 strcpy (c2, c1); //дает warning C4996 s1 = "new string one "; s2 = s1; cout << c1 <<"\n"; cout << c2 <<"\n"; cout << s1 <<"\n"; cout << s2 <<"\n";;
//конкатенация строк strcpy(c3,c1); //дает warning C4996 strncat (c3,c2,strlen(c2)); //дает warning C4996 // strncat_s (string, "Hello world from "); не дает warning C4996 s3=s1+s2; cout << c3 <<"\n"; cout << s3 <<"\n";
//сравнение строк if (strcmp(c2, c3) <0) cout << c2; else cout << c3; cout << "\n";
if (s2 < s3) cout << s2; else cout << s3; cout << "\n";
getch(); return 0; }
Ввод-вывод #include <string> int main() { string s; cout << "input slova:" << endl; cin >> s; //ввод до первого пробельного символа cout << s << endl; //вывод строки cin.get(); //удаление из потока символа ‘\n’ cout << "input c probelami:" << endl; getline(cin,s); //ввод строки с пробелами cout << s << endl; cout << "input strok c $:" << endl; getline(cin,s,'$'); //ввод строки до символа завершения '$' cout << s << endl; _getch(); return 0; }
// ввод-вывод #include <string> int main() { string full_name, nickname, address; string greeting("Hello, ");
cout << "Enter your full name: "; getline(cin, full_name); //ввод строки с пробелами cout << "Your full name is: " << full_name << endl;
cout << "Enter your nickname: "; cin >> nickname; //ввод строки-объекта
greeting += nickname; //добавление имени к строке-приветствию cout << greeting << endl; //вывод: "Hello, Jim"
cout << "Enter your address on separate lines\n"; cout << "Terminate with '$'\n"; getline(cin, address, '$'); //ввод нескольких строк cout << "Your address is: " << address << endl; _getch(); return 0; } Результаты работы программы: Enter your full name: lar str Your full name is: lar str Enter your nickname: mama Hello, mama Enter your address on separate lines Terminate with '$' aaa bbb ccc$ Your address is: aaa bbb ccc
Методы корректировки #include <string> int main() { string s1("Quick! Send for Count Graystone."); string s2("Lord"); string s3("Don't ");
s1.erase(0, 7); //удаление "Quick! " s1.replace(9, 5, s2); //замена "Count" на "Lord" s1.replace(0, 1, "s"); //замена 'S' на 's' s1.insert(0, s3); //вставка "Don't " в начало s1.erase(s1.size()-1, 1); //удаление '.' s1.append(3, '!'); //добавление "!!!"
size_t x = s1.find(' '); //поиск пробела и возврат его позиции while(x < s1.size()) //продолжать пока пробел не найден { s1.replace(x, 1, "/"); //замена пробела на слэш x = s1.find(' '); //поиск следующего пробела } cout << "s1: " << s1 << endl; _getch(); return 0; }
Результаты работы программы: s1: Don't/send/for/Lord/Graystone!!!
//методы assign, insert, erase, replace #include <string> int main() { string s0, s01, s02,s03, s04; s0.assign("aabb"); //s0=”aabb” s01.assign(s0); //s01=s0 s02.assign("ccc"); //s02=”ccc” s03.assign(s01,2,1); //s03 присваивается 2-ой символ из s01 s04.assign("abcd",3); //s04 присваивается первые 3 символa строки "abcd" cout << "s0= " <<s0<< endl; // cout << "s01= " <<s01 << endl; cout << "s02= " <<s02 <<endl; cout << "s03= " <<s03 <<endl; cout << "s04= " <<s04 <<endl;
string s1 ("a"), s2("ok"), s3("les"); cout << "s1= " <<s1<< endl; // cout << "s2= " <<s2 << endl; cout << "s3= " <<s3 <<endl;
// insert, erase: cout << "s3: " <<s3.insert(3,s1) << endl; //lesa cout << "s3: " <<s3.insert(3,s2) <<endl; //lesoka cout << "s3: " <<s3.erase(5,1) <<endl; //lesok cout << "s3: " <<s3.insert(5,s1) <<endl; //lesoka cout << "s3: " <<s3.erase(3,1) <<endl; //leska
// replace: cout << "s3= " <<s3.replace(1,1,s1, 0,1) <<endl; //laska string s ("mam"); cout << s.at(1) << endl; //будет выведен символ a s.at(1)='o'; //символ a заменится на символ o cout << s.at(1)<< "\n"; _getch(); return 0; } Результаты работы программы: s0= aabb s01= aabb s02= ccc s03= b s04= abc s1= a s2= ok s3= les s3: lesa s3: lesoka s3: lesok s3: lesoka s3: leska s3= laska a o
Методы сравнения #include <string> int main() { string aName = "George"; string userName;
cout << "Enter your first name: "; cin >> userName; if (! userName.compare("")) {cout << "pusto" << endl; return 1;}
if(userName==aName) //operator == cout << "Greetings, George\n"; else if(userName < aName) //operator < cout << "You come before George\n"; else cout << "You come after George\n"; //или if (!userName.compare(aName)) cout <<" = "; else if (userName.compare(aName)<0) cout <<" < "; else cout << " > ";
int n = userName.compare(0, 2, aName, 0, 2); //функция compare() cout << "The first two letters of your name "; if(n==0) cout << "match "; else if(n < 0) cout << "come before "; else cout << "come after "; cout << aName.substr(0, 2) << endl;
_getch(); return 0; }
Результаты работы программы: Enter your first name: George Greetings, George The first two letters of your name match Ge или: Enter your first name: Ivan You come after George The first two letters of your name come after Ge
Методы поиска подстроки #include <string> int main() { string s1 = "In Xanadu did Kubla Kahn a stately pleasure dome decree"; size_t n; n = s1.find("Kubla"); // в строке s1 ищется самое левое cout << "Found Kubla at " << n << endl;
n = s1.find_first_of("spde"); // в строке s1 ищется // символов данной строки cout << "First of spde at " << n << endl;
n = s1.find_first_not_of("aeiouAEIOU"); //в исходной строке ищется //отличного от указанных в данной строке cout << "First consonent at " << n << endl; _getch(); return 0; } Результаты работы программы: Found Kubla at 14 First of spde at 7 First consonent at 1
Int main () { string word, curword; cout << "input" << endl; cin >> word; ifstream fin ("infile.txt", ios::in); if(!fin) {cout << "error" << endl; _getch(); return 1;} int count =0; while (!fin.eof()) { fin >> curword; if (equal(curword, word)) count++; } cout << count << endl; _getch(); return 0; }
bool equal(const string& cw, const string& w) { char punct[]= {'.',',','?','!'}; if (cw==w) return true; for (int i=0; i< sizeof(punct); ++i) if (cw==w + punct[i]) return true; return false; }
Int main () { ifstream fin ("aaaaa.txt", ios::in); if(!fin) {cout << "error" << endl; _getch(); return 1;} int count =0; string word; ostringstream sentence;
while (true) { char symb; while (isLimit(symb = fin.peek())) { //если разделитель sentence << symb; //записывем его в поток if (symb=='\n') break; fin.seekg(1, ios::cur); } fin >> word; //читаем из файла слово if (fin.eof()) break; sentence << word; //записываем слово в строковый поток char last = word[word.size() - 1]; //выделяем последний символ слова if ((last=='.')|| (last == '!')) { //если предложение не? sentence.str(""); //очистка строкового потока continue; } if (last=='?') { cout << sentence. str (); //вывод содержимого потока sentence.str(""); //очистка потока count++; } } if (!count) cout << "? net " << endl;
_getch(); return 0; }
bool isLimit(char c) { char lim[]= {' ','\t','\n'}; for (int i=0; i< sizeof(lim); ++i) if (c==lim[i]) return true; return false; } Часть библиотеки, в которую входят контейнерные классы, алгоритмы и итераторы, называют стандартной библиотекой шаблонов (STL – Standard Template Library). В основе архитектурных решений библиотеки STL лежат следующие особенности. Первая особенность – разделение данных и операций ( принципы противоположны принципам ООП, где объект соединяет данные и операции ). Концепция STL основана на отделении данных от операций. Данные хранятся в контейнерах, а операции определяются адаптируемыми алгоритмами. Разные алгоритмы по мере необходимости применяются к разным контейнерам. За счет этого отделения достигнуты гибкость и компактность библиотеки STL. Вторая фундаментальная особенность STL – параметризация и контейнеров, и алгоритмов. Все компоненты STL реализованы в виде шаблонов, которые могут работать с любыми типами, для которых допустимы операции, используемые компонентом. Третья особенность – применение итераторов. Итераторы как бы «склеивают» контейнеры и алгоритмы, благодаря чему любой алгоритм может работать практически с любым контейнером. Для использования контейнеров и адаптеров необходимо подключать стандартные заголовочные файлы:
Для использования алгоритмов и итераторов необходимо подключать стандартные заголовочные файлы:
Контейнеры В STL контейнер – это параметризованный класс, представляемый шаблоном классов. Объект такого параметризованного класса пригоден для включения других объектов, поэтому один и тот же вид контейнера можно использовать для хранения данных различных типов (встроенных, либо пользовательских). Элементами контейнеров могут быть и контейнеры. Реализуются контейнеры, как правило, с помощью указателей и динамической памяти, поэтому один из параметров шаблона определяет по умолчанию распределитель памяти. Использование указателей и динамических переменных в классах в сочетании с перегрузкой операций является мощным средством создания новых типов данных. Использование контейнеров позволяет повысить надежность программ, их переносимость и универсальность, уменьшить сроки разработки. В то же время эти преимущества отражаются на быстродействии программы (оно снижается). Для эффективного использования контейнеров требуется вдумчивое освоение библиотеки STL.
Для каждого типа контейнера определены методы для работы с его элементами, не зависящие от конкретного типа данных, которые хранятся в контейнере, Выбор вида контейнера зависит от того, что требуется делать с данными в программе. Контейнеры могут быть фиксированного или переменного размера. Способ доступа к элементам контейнера: · прямой – доступ по индексу элемента; · последовательный – последовательное перемещение от элемента к элементу; · ассоциативный – похож на прямой, однако основан не на индексах элементов, а на их содержимом (поле, с содержимым которого ассоциируется элемент контейнера, называется ключом). Тип контейнера – это способ доступа к его элементам (но не тип его элементов): Для представления различных структур данных (коллекций) в STL определены контейнеры двух видов: · Последовательные контейнеры, представляющие собой упорядоченные коллекции, в которых каждый элемент занимает позицию, не зависящую от значения элемента. Позиция может зависеть от того, какой была коллекция в момент помещения в нее элемента и/или от явного указания места для размещаемого элемента. Последовательные контейнеры обеспечивают хранение конечного количества однотипных величин в виде непрерывной неупорядоченной последовательности. К ним относятся двусторонние очереди (deque), списки (list), векторы (vector), а также так называемые адаптеры, то есть варианты контейнеров – стеки (stack), очереди (queue) и очереди с приоритетами (priority_queue). · Ассоциативные контейнеры, представляющие собой отсортированные по умолчанию коллекции однотипных элементов, в которых позиция элемента зависит от его значения. Ассоциативные контейнеры автоматически упорядочивают включаемые в них элементы по некоторому критерию. Критерий реализуется в виде функции, которая сравнивает либо значения элементов, либо специальные ключи, заданные для этих значений (элементов). Ассоциативные контейнеры реализуются в виде бинарных деревьев, где у каждого узла-элемента есть два узла–потомка (правый и левый). Все производные узлы слева имеют меньшие значения, а все производные справа – большие. К ассоциативным контейнерам относят: словари (map), словари с повторяющимися элементами (multimap), множества (set), множества с повторяющимися элементами (multiset), битовые множества (bitset).
Сравнение контейнеров Для однотипных контейнеров сравнение может быть выполнено с помощью стандартных операций отношений ==,!=, <, <=, >, >=. Отношения <, <=, >, >= проверяются по лексикографическому критерию. В этом случае два контейнера сравниваются с учетом интервалов размещения элементов [beg1, end1) и [beg2, end2). Элементы из интервалов сравниваются попарно до тех пор, пока не будет выполнено одно из условий: · если очередные два элемента не равны, то результат этих элементов сравнения определяет результат сравнения контейнеров; · если интервалы не равны, то при парном сравнении элементов может быть достигнут конец меньшего интервала, а истинность проверяемого условия еще не установлена. В этом случае контейнер с меньшим количеством элементов считается меньшим. Методы частного применения
push_back() – вставка элемента в конец контейнера; применим к деку, вектору, списку. push_front() – вставка элемента в начало контейнера; применим к деку, списку.
pop_back() – удаление последнего элемента контейнера; применим к деку, вектору, списку. pop_front() – удаление элемента из начала контейнера; применим к деку, списку Методы pop_back() и pop_front() не возвращают удаленное значение. Для считывания первого элемента используется метод front(), а для считывания последнего элемента – метод back().
Контейнер vector эффективно обрабатывает произвольную выборку элементов с помощью операции индексации [] или метода at, который аналогичен операции индексации, но в отличие от нее проверяет выход за границу вектора (генерирует исключение out_of_range, если такое нарушение обнаруживается).
Действия методов вставки и удаления:
push_back() push_front() элементы последовательности
pop_back() pop_front()
Применение представленных в таблице методов дает разную эффективность для разных контейнеров:
Обозначения в таблице: O(1) – длительность операции не зависит от числа элементов в контейнере; O(n) – длительность операции пропорциональна числу элементов в контейнере; + – суффикс, обозначающий, что длительность исполнения операции может возрастать; - – неприменимость операции к контейнеру. Итераторы Каждый контейнер включает тип с названием итератор.В шаблоне контейнера с параметром Т этому типу соответствуют Т* или const Т*, т.е. итератор ведет себя как указатель на элемент, помещенный в контейнер. Итератор – объект, по своим функциям напоминающий указатель при работе с массивом, аналог указателя на элемент. Он используется для обеспечения доступа к элементам контейнера, для просмотра контейнера в прямом или обратном направлении. От него требуется умение ссылаться на элемент контейнера и реализовывать операции перехода к следующему элементу. При помощи итераторов можно просматривать контейнеры, не заботясь о фактических типах данных, используемых для доступа к элементам. Константные итераторы используются тогда, когда значений соответствующих элементов контейнера не изменяются. Существуют итераторы: · однонаправленные (прямые); если нужно продвигаться вперед, но при этом совершать как запись, так и чтение, используется «прямой» итератор; · двунаправленные; · обеспечивающие произвольное перемещение (произвольный доступ); итератор «произвольного доступа» обеспечивает доступ к элементу контейнера без всяких продвижений.
Имеются два специализированных типа итераторов: · потоковые итераторы, благодаря которым входные и выходные потоки могут вести себя как итераторы: § ostream_iterator – итератор выходного потока; используется, если требуется только лишь продвинуться на один шаг по контейнеру для осуществления последовательной записи, например, при записи в файл или выводе на экран; § istream_iterator – итератор входного потока; используется, если требуется только лишь продвинуться на один шаг по контейнеру. для осуществления последовательного чтения, например, при чтении из файлов или с клавиатуры.
· адаптеры итераторов – варианты модификации обычного итератора, которые могут необычным способом изменять поведение обычных итераторов: o обратный итератор (reverse_iterator) для реверсного прохода контейнера (в обратном направлении); o итератор вставки: § back_inserter вставляет новые элементы в конец контейнера § front_inserter вставляет новые элементы в начало контейнера (кроме вектора) § inserter вставляет новые элементы в указанное место o итератор неинициализированного хранения, позволяющий хранить данные в неинициализированном еще участке памяти.
Для просмотра контейнеров с помощью итераторов в каждом контейнере определены методы:
Алгоритмы Алгоритм – независимая шаблонная функция, производящая действия над элементами контейнера (для ее использования к программе подключается заголовочный файл <algorithm>). Алгоритмы можно использовать и при работе с обычными массивами С++. Наиболее популярные алгоритмы STL:
В списках параметров всех алгоритмов первые два параметра задают диапазон обрабатываемых элементов в виде полуинтервала [first, last), где first – итератор, указывающий на начало диапазона, а last – итератор, указывающий на выход за границы диапазона, т.е. на элемент, распол
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Последнее изменение этой страницы: 2016-12-17; просмотров: 477; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.138.34.93 (0.014 с.) |