
- •История изменений
- •Благодарности
- •Основы
- •Привет, Мир!
- •Ввод-вывод
- •Целые числа
- •Символы и строки
- •String
- •Перевод строки в целое число
- •Перевод целого числа в строку
- •Случайные числа
- •Профилирование
- •Массивы и матрицы
- •Объявление, размещение и инициализация массивов
- •Ввод массива
- •Вывод массива
- •Valarray
- •Vector
- •Матрицы
- •Элементарные алгоритмы
- •Абсолютное значение целого числа
- •Минимум и максимум среди двух чисел
- •Минимум и максимум среди трёх чисел
- •Сортировка массива из трёх чисел
- •Циклический сдвиг массива из трёх элементов
- •Разложение целого числа на его цифры
- •Линейный поиск
- •Рекурсия
- •Более сложные алгоритмы
- •Бинарный поиск
- •Циклический сдвиг массива
- •Подводные камни
- •Диграфы и триграфы
10 |
|
|
Симоненко Евгений А. Олимпиадная подготовка по программированию |
|||
|
|
|
|
|
|
|
Название |
Назначение |
|
|
Сигнатура |
|
Возвращаемое значение |
|
|
|
|
|
|
|
|
|
|
|
|
|
символов из delimiters. |
|
|
|
|
|
|
|
Включив заголовок cctype мы получаем доступ к функциям библиотеки C для символов: |
||||||
|
|
|
|
|
||
Название |
Назначение |
|
Сигнатура |
Возвращаемое значение |
||
|
|
|
|
|||
tolower() |
Понижение регистра |
int tolower(int c); |
Символ, преобразованный в нижний регистр, если |
|||
|
символа. |
|
|
это возможно, или неизменённое значение c, в |
||
|
|
|
|
|
противном случае. |
|
toupper() |
Повышение регистра |
int toupper(int c); |
Символ, преобразованный в верхний регистр, если |
|||
|
символа. |
|
|
это возможно, или неизменённое значение c, в |
||
|
|
|
|
|
противном случае. |
|
islower() |
Проверка на нижний |
int islower(int c); |
Число большее 0, если символ c является символом |
|||
|
регистр символа. |
|
|
в нижнем регистре, и 0 в противном случае. |
||
isupper() |
Проверка на верхний |
int isupper(int c); |
Число большее 0, если символ c является символом |
|||
|
регистр символа. |
|
|
в верхнем регистре, и 0 в противном случае. |
||
isalpha() |
Проверка, является |
int isalpha(int c); |
Число большее 0, если символ c является буквой, и 0 |
|||
|
ли символ буквой. |
|
|
в противном случае. |
STRING
Создатели C++ в дополнение к встроенным типам языка C добавили специальный тип string для строк. Это объектно-ориентированный тип (класс), и его использование влечёт за собой дополнительные расходы на память и процессорное время. Но он очень удобен. Например, он позволяет вводить строки произвольной длины, что в некоторых задачах бывает очень важно.
Так как тип является встроенным, то не требуется для его использования включать какие-либо заголовки, но для некоторых функций (например, для ввода-вывода) всё же требуется включить заголовок <string>.
Ниже в таблице перечислены самые востребованные методы класса string:
Название |
Назначение |
|
Сигнатура |
|
Возвращаемое значение |
|
|
|
|
|
|
|
|
append() |
Конкатенация. |
|
string& append(const string& str); |
|
Саму строку, к которой была |
|
|
|
|
string& append(const string& str, size_t pos, |
добавлена другая строка |
||
|
|
|
size_t n); |
|
|
или символы. |
|
|
|
string& append(const char* str, size_t n); |
|
||
|
|
|
string& append(const char* str); |
|
|
|
|
|
|
string& append(size_t n, char c); |
|
|
|
|
|
|
template<class |
InputIterator> |
string& |
|
|
|
|
append(InputIterator first, InputIterator last); |
|
||
begin() |
Итератор |
начала |
iterator begin(); |
|
|
Итератор начала строки. |
|
строки. |
|
|
|
|
|
clear() |
Очистка строки. |
void clear(); |
|
|
|
|
|
|
|
|
|
|
|
Симоненко Евгений А. Олимпиадная подготовка по программированию |
|
|
|
|
|
|
|
11 |
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Название |
Назначение |
|
Сигнатура |
|
|
Возвращаемое значение |
|||||||||
|
|
|
|
|
|
|
|||||||||
compare() |
Сравнение |
двух |
int compare(const string& str) const; |
|
|
Число 0, если строки |
|||||||||
|
строк. |
|
int compare(const char* str) const; |
|
|
посимвольно |
|
совпадают; |
|||||||
|
|
|
int compare(size_t pos1, size_t n1, const |
|
число большее 0, если в |
||||||||||
|
|
|
string& str) const; |
|
|
|
первой строке обнаружен |
||||||||
|
|
|
int compare(size_t pos1, size_t n1, const |
|
символ |
|
|
больший |
|||||||
|
|
|
char* str) const; |
|
|
|
|
соответствующего |
символа |
||||||
|
|
|
int compare(size_t pos1, size_t n1, const |
|
второй; и меньшее 0 в |
||||||||||
|
|
|
string& str, size_t pos2, size_t n2) const; |
|
|
противном |
|
|
|
случае. |
|||||
|
|
|
int compare(size_t pos1, size_t n1, const |
|
(Лексикографический |
|
|||||||||
|
|
|
char* str, size_t n2) const; |
|
|
порядок.) |
|
|
|
|
|
||||
empty() |
Проверка на пустоту. |
bool empty() const; |
|
|
|
true, |
|
если |
строка |
пуста |
|||||
|
|
|
|
|
|
|
|
(количество |
символов |
0), |
|||||
|
|
|
|
|
|
|
|
false в противном случае. |
|||||||
end() |
Итератор |
конца |
iterator end(); |
|
|
|
|
Итератор конца строки. |
|
||||||
|
строки. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
erase() |
Удаление |
символов |
string& erase(size_t pos = 0, size_t n = |
|
Саму строку, |
|
или |
итератор |
|||||||
|
из строки. |
|
npos); |
|
|
|
|
на |
первый |
|
очищенный |
||||
|
|
|
iterator erase(iterator position); |
|
|
символ или итератор конца, |
|||||||||
|
|
|
iterator erase(iterator first, iterator last); |
|
если |
|
ничего |
не |
было |
||||||
|
|
|
|
|
|
|
|
очищено. |
|
|
|
|
|
||
find() |
Поиск подстроки в |
size_t find(const string& str, size_t pos = 0) |
|
Номер |
символа |
|
первого |
||||||||
|
строке. |
|
const; |
|
|
|
|
вхождения подстроки. Если |
|||||||
|
|
|
size_t find(const char* str, size_t pos, size_t |
|
подстрока |
не |
|
найдена |
|||||||
|
|
|
n) const; |
|
|
|
|
возвращается string::npos. |
|||||||
|
|
|
size_t find(const char* str, size_t pos = 0) |
|
|
|
|
|
|
|
|
|
|||
|
|
|
const; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
size_t find(char c, size_t pos = 0) const; |
|
|
|
|
|
|
|
|
|
|
||
insert() |
Вставка подстроки в |
string& insert(size_t pos1, const string& str); |
|
Саму |
|
строку, |
|
или |
итератор |
||||||
|
строку. |
|
string& insert(size_t pos1, const string& str, |
|
на |
|
место |
|
|
первого |
|||||
|
|
|
size_t pos2, size_t n); |
|
|
вставленного |
|
символа |
или |
||||||
|
|
|
string& insert(size_t pos1, const char* str, |
|
ничего. |
|
|
|
|
|
|||||
|
|
|
size_t n); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
string& insert(size_t pos1, const char* str); |
|
|
|
|
|
|
|
|
|
|||
|
|
|
string& insert(size_t pos1, size_t n, char c); |
|
|
|
|
|
|
|
|
|
|||
|
|
|
iterator insert(iterator p, char c); |
|
|
|
|
|
|
|
|
|
|
||
|
|
|
void insert(iterator p, size_t n, char c); |
|
|
|
|
|
|
|
|
|
|
||
|
|
|
template<class |
|
InputIterator> |
void |
|
|
|
|
|
|
|
|
|
|
|
|
insert(iterator |
p, |
InputIterator |
first, |
|
|
|
|
|
|
|
|
|
|
|
|
InputIterator last); |
|
|
|
|
|
|
|
|
|
|
|
|
length() |
Длина строки (коли- |
size_t length() const; |
|
|
|
Длина |
строки |
(количество |
|||||||
|
чество символов). |
|
|
|
|
|
символов). |
|
|
|
|
|
Для сравнения строк можно использовать не только метод compare(), но и операции сравнения ==, !=, <, >, <= и >=. См. задачу «A. Петя и Java» (http://codeforces.ru/contest/66/problem/A).
ПЕРЕВОД СТРОКИ В ЦЕЛОЕ ЧИСЛО
Для перевода строки в целое число можно использовать как «ручной» метод, так и функции библиотеки C.
«Ручной» метод основан на посимвольном сканировании строки с конца, представляющей целое число, с последующем получением из кода символа-цифры его значения, умножения его на 10 в
12 |
Симоненко Евгений А. Олимпиадная подготовка по программированию |
соответствующей степени и добавлении к формируемому числу.
#include <iostream> #include <string>
using namespace std;
int main(int argc, char* argv[]) { string s;
cin >> s;
int x = 0;
for (string::reverse_iterator it = s.rbegin(); it < s.rend(); it++) { static int d = 1;
x += (*it - '0') * d; d *= 10;
}
cout << x << endl;
return 0;
}
В стандартной библиотеке C есть семейство функций atoi(), atol() и atoll(), переводящих из C-стро- ки, представляющей целое число, в собственно целое число:
Название |
Назначение |
Сигнатура |
Возвращаемое значение |
|
|
|
|
atoi() |
В целое типа int. |
int atoi(const char* str); |
Целое число типа int. |
atol() |
В целое типа long. |
long atol(const char* str); |
Целое число типа long. |
|
|
|
|
atoll() |
В целое типа long long. |
long long atoll(const char* str); |
Целое число типа long long. |
|
|
|
|
Эти функции объявлены в заголовке <cstdlib>.
Иногда встречающейся ошибкой является использование atol() для перевода в целое типа long long. Попутно следует заметить, что функция atoll() (с двумя l) является свежим добавлением в стандарт C++ и в Visual Studio 2008 нереализована, в то время как в библиотеке, идущей с MinGW GCC 4.4, имеется.
ПЕРЕВОД ЦЕЛОГО ЧИСЛА В СТРОКУ
Так же как и перевод из строки в целое число, так и из целого числа в строку, можно осуществить разными способами: «ручным», с использованием класса stringstream, функции itoa() или функции sprintf().
«Ручной» способ основан на выделении отдельных десятичных цифр с последующим преобразованием их в символы (см. пункт «Разложение целого числа на его цифры»):
#include <iostream> #include <string> #include <algorithm>
using namespace std;
int main(int argc, char* argv[]) { int x;
cin >> x;
string str; str.reserve(10); while (x != 0) {
str.push_back(x % 10 + '0'); x /= 10;
}
reverse(str.begin(), str.end());
cout << str << endl;
Симоненко Евгений А. Олимпиадная подготовка по программированию |
13 |
return 0;
}
Для использования класса stringstream нужно подключить заголовок <sstream>:
#include <iostream> #include <string> #include <sstream>
using namespace std;
int main(int argc, char* argv[]) { int x;
cin >> x;
stringstream ss; ss << x;
string s = ss.str();
cout << s << endl;
return 0;
}
Наконец, можно воспользоваться нестандартной функцией itoa(), получающей на вход целое число типа int, указатель на C-строку, куда будет помещён результат, и основание системы исчисления:
#include <iostream>
using namespace std;
int main(int argc, char* argv[]) { int x;
cin >> x;
char s[10]; itoa(x, s, 10);
cout << s << endl;
return 0;
}
Вместо нестандартной функции itoa() рекомендуется использовать стандартную функцию sprintf(). Эта функция получает на вход указатель на C-строку, куда будет помещён результат, строку формата как у функции printf() (см. пункт «Ввод-вывод») и список значений, которые должны быть преобразованы в строку:
#include <cstdio>
int main(int argc, char* argv[]) { int x;
scanf("%d", &x);
char s[10]; sprintf(s, "%d", x);
puts(s);
return 0;
}
СЛУЧАЙНЫЕ ЧИСЛА
При написании тестов к решениям задач часто бывает полезным генерировать входные данные случайным образом. Для этого можно пользоваться стандартной функцией rand(). Эта функция не имеет входных параметров и возвращает целое число в диапазоне от 0 до RAND_MAX. Так как в подавляющем большинстве случаев нам нужен другой диапазон целых чисел, то простейшим способом его получить будет получение остатка от деления значения возвращаемого rand() на верхнюю границу диапазона: пусть a – нижняя граница, а b – верхняя, тогда можно написать та-