- •Строки стандартного класса string 2
- •Примеры использования методов строк-объектов 5
- •Стандартная библиотека шаблонов 14
- •Шаблонный класс для представления динамических одномерных массивов 35 Строки стандартного класса string
- •Операции
- •Методы класса string
- •Примеры использования методов строк-объектов Примеры работы со строками разных типов
- •Определение строк, присваивание, конкатенация, вычисление длины
- •Методы корректировки
- •Ввод-вывод
- •Доступ к элементу строки, метод at, метод copy
- •Методы сравнения
- •Методы поиска подстроки
- •Выделение подстроки, метод substr
- •Обеспечение ввода символов только из заданного набора
- •Подсчет количества вхождений слова в текст
- •Вывод вопросительных предложений
- •Стандартная библиотека шаблонов
- •Контейнеры
- •Общие методы и операции контейнеров Способы определения объекта для последовательного контейнера
- •Оценка числа элементов и размеров контейнера
- •Сравнение контейнеров
- •Присваивание контейнеров и обмен содержимым
- •Методы частного применения
- •Итераторы
- •Алгоритмы
- •Примеры Использование контейнера vector и его итераторов для вычисления диапазона копирования элементов массива
- •Использование контейнера vector при сортировке строк
- •Использование контейнера vector при считывании чисел из файла
- •Использование контейнера vector при считывании строк из файла
- •Использование контейнера list для реверса последовательности элементов
- •Демонстрация обратного итератора
- •Использование алгоритма find()для поиска заданного числа
- •Использование контейнера list при считывании чисел из файла
- •Использование контейнера list при считывании строк из файла
- •Использование контейнера list и потокового итератора при выводе последовательности структур на экран
- •Использование адаптера stack при считывании чисел из файла
- •Вычисление числа объектов с заданным значением
- •Поиск первого объекта с заданным значением
- •Поиск в массиве строк заданного имени
- •Использование потокового итератора при чтении вещественных чисел с клавиатуры и записи их в файл
- •Использование потокового итератора при чтении чисел из файла и выводе их на экран
- •Шаблонный класс для представления динамических одномерных массивов
Выделение подстроки, метод substr
#include <string>
int main()
{
string s1("123456");
string s2;
s2 = s1.substr(2,3); //в s2 заносятся 3 символа s1 с позиции 2
cout<<"s2="<< s2<<endl;
s2 = s1.substr(3); //в s2 заносятся все символы s1 с позиции 3
cout<<"s2="<< s2<<endl;
s2 = s1.substr(); //s2=s1
cout<<"s2="<< s2<<endl;
_getch();
return 0;
}
Обеспечение ввода символов только из заданного набора
#include <string>
int main()
{
string s = "ABCDEFGH";
char symb;
cout<< "symbol=?";
while (1) { //цикл не допустит ввод символов не из строки s
cin >> symb;
if (s.find(symb)==-1) {
cout<< "ne tot symbol;\n symbol=?";
continue;
}
cout<< "OK!!!" << endl;}
_getch();
return 0;
}
Подсчет количества вхождений слова в текст
Определить, сколько раз встретилось заданное слово в текстовом файле.
Определим слово в тексте как последовательность алфавитно-цифровых символов, после которых следует либо знак пунктуации (точка, запятая, вопросительный знак, восклицательный знак), либо разделитель (один или несколько пробелов, символов табуляции ‘\t’ и символ конца строки ‘\n’. Для хранения заданного слова (оно вводится с клавиатуры) определим переменную word типа string.
Поскольку максимальная длина строки в файле неизвестна, будем читать файл пословно, помещая каждое очередное прочитанное слово в переменной сurword типа string. Такое чтение можно реализовать с помощью операции >>, которая в случае операнда типа string игнорирует все разделители, предваряющие текущее слово, и считывает символы текущего слова в переменную сurword, пока не встретится очередной разделитель. «Опознание» текущего слова должно осуществляться с учетом возможного наличия после него одного из знаков пунктуации. Для решения этой задачи определим глобальную функцию
bool equal(const string& cw, const string& w);
которая возвращает значение true, если текущее слово cw совпадает с заданным словом w с точностью до знака пунктуации, в противном случае – false.
// stdafx.h
#pragma once
#define WIN32_LEAN_AND_MEAN
#include <stdio.h>
#include <tchar.h>
// TODO: reference additional headers your program requires here
#include <string>
#include <fstream>
#include <iostream>
#include <conio.h>
using namespace std;
bool equal(const string& cw, const string& w);
////////////////////////////////////////////////////////////////////////
// main.cpp
#include "stdafx.h"
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;
}
Вывод вопросительных предложений
Считать текст из файла и вывести из него только вопросительные предложения.
Имеем текстовый файл неизвестного размера, состоящий из неизвестного количества предложений. Предложение может занимать несколько строк, поэтому читать файл построчно неудобно (сложный алгоритм). Будем читать файл пословно в переменную word типа string и отправлять каждое прочитанное слово в строковый поток sentence типа ostringstream, который будет хранилищем предложения. Так как при чтении из файла с помощью операции fin >> word, происходит потеря разделителей, то будем «заглядывать» в следующую позицию файлового потока fin с помощью операции peek(). При обнаружении символа-разделителя его нужно отправить в поток sentence и переместиться в потоке fin на следующую позицию, используя метод seekg(). Обнаружение символа-разделителя реализуем в глобальной функции isLimit().
// stdafx.h
#pragma once
#define WIN32_LEAN_AND_MEAN
#include <stdio.h>
#include <tchar.h>
#include <string>
#include <fstream>
#include <iostream>
#include <fstream>
#include <sstream>
#include <conio.h>
using namespace std;
bool isLimit(char c);
////////////////////////////////////////////////////////////////////////
// main.cpp
#include "stdafx.h"
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;
}
