Вектор в библиотеке STL — это удобный массив (вернее, структура, аналогичная массиву), размер которого может изменяться динамически. Вектор целых чисел A задается таким образом:
Аналогично можно задавать векторы любого другого типа.
Вектор поддерживает операцию обращения по индексу A[i] , как и обычный массив, но в отличии от обычного массива размер вектора может меняться. У вектора есть метод size , возвращающий количество элементов в векторе в настоящий момент.
Есть несколько способов создать вектор (конструкторы вектора):
vector(B) , где B — вектор такого же типа. Создает копию вектора B
vector(n) , где n — целое число. Создает вектор из n элементов.
vector(n, val) — создает вектор из n элементов, заполненных значением val .
создаст вектор A из 10 элементов равных 179, а затем вектор B , являющийся копией вектора A .
Конструкторы можно вызывать явно для создания объектов, например, vector (10, 179) создаст объект типа vector и вызовет для вновь создаваемого объекта конструктор.
Для изменения вектора можно использовать метод resize . Первый его параметр — новый размер вектора, второй параметр (необязательный, имеет смысл только при увеличении размера вектора) — значение, которым заполняются вновь созданные элементы.
Для добавления нового элемента в конец вектора можно использовать метод push_back(val) . Для удаления последнего элемента из вектора можно использовать метод pop_back() .
Из вектора A можно удалить элемент с индексом i при помощи A.erase(A.begin() + i) . Для удаления элементов с i -го (включая) до j -го (не включая) можно использовать A.erase(A.begin() + i, A.begin() + j) . Также можно использовать итератор end() , возвращающий элемент на конец вектора (фиктивный элемент, следующий за последним). Например, удалить элементы с i -го до конца можно при помощи A.erase(A.begin() + i, A.end()) , а удалить k последних элемента вектора можно при помощи A.erase(A.end() — k, A.end()) . Удаление требует сдвига элементов, поэтому выполняется за линейное время.
Вставить значения в вектор можно при помощи метода insert . Например, вставить элемент val перед i -м элементов вектора A можно при помощи A.insert(A.begin() + i, val) . Если же передать в качестве указателя два итератора, то можно вставить весь фрагмент между итераторами. Например, A.insert(A.begin(), B.begin(), B.end()) вставляет в начало вектора A все содержимое вектора B .
Более подробно обо всех методах работы с векторами можно прочесть на cppreference.com.
- Операции со строками в STL
- Считывание строк
- Арифметические операторы
- Конструкторы
- Методы для строк
- Упражнения
- A: Есть ли символ @
- B: Есть ли гласная
- C: Подсчитайте количество символов @
- D: Подсчитайте количество гласных
- E: Поиск подстроки
- F: Сколько раз одна подстрока находится внутри другой?
- G: Вычеркнуть буквы
- H: Пробелы после запятой
- I: Продублировать гласные буквы
- J: Удалите все символы @
- K: Удалите все гласные буквы
- L: Удалить все вхождения слова
- M: Удалить все внутри скобок
- N: Замените 1 на one везде
- O: Заменить все вхождения слова
- P: Удалите лишние пробелы
- Q: Поменять два слова местами
- R: Пословное обращение строки
- S: Смайлики
- T: Выравнивание по левому краю
- U: Выравнивание по ширине
- V: Правила оформления программ
- W: Действительное число
- X: Значение выражения
- Y: EuroEnglish
- Z: Форматирование текста
- ZA: Химические реакции
- Как использовать вектор (vecto) в C++
- Класс и объекты
- Класс Vector
- Создание экземпляра вектора
- Перегрузка функции
- Построение вектора
- Конструирование с инициализацией
- Назначение вектора во время Construction
- const Vector
- Конструирование с помощью Iterator
- Уничтожение вектора
- Емкость вектора
- Присвоение значения с помощью нижнего индекса
- Присвоение значения с помощью функции at ()
- Проблема с подпрограммами
- Доступ к векторным данным
- Возвращение итераторов и вектора
- Обратная итерация
- Векторные модификаторы
- Операторы равенства и отношения для векторов
- Векторы в C++: для начинающих
- Что такое вектор (vector)
- Как создать вектор (vector) в C++
- Второй способ обратиться к ячейке
- Как указать количество ячеек для вектора
- Как сравнить два вектора
Видео:vector | Библиотека стандартных шаблонов (stl) | Уроки | C++ | #1Скачать
Операции со строками в STL
В этом листке мы снова будем работать со строками, активно используя стандартную библиотеку языка C++ STL (Standard template library).
Видео:Вектор. Сложение и вычитание. 9 класс | МатематикаСкачать
Считывание строк
Напомним, что строки можно считывать двумя способами: до пробельного символа (пробела, конца строки, символа табуляции) при помощи конструкции cin >> S , и до конца строки при помощи функции getline(cin, S) .
Видео:Выразить векторы. Разложить векторы. Задачи по рисункам. ГеометрияСкачать
Арифметические операторы
Со строками можно выполнять следующие арифметические операции:
= — присваивание значения.
+= — добавление в конец строки другой строки или символа.
+ — конкатенация двух строк, конкатенация строки и символа.
== , != — посимвольное сравнение.
, > , , >= — лексикографическое сравнение.
Подробней об операторах для строк читайте здесь.
Видео:Как разложить вектор по базису - bezbotvyСкачать
Конструкторы
Строки можно создавать с использованием следующих конструкторов:
string() — конструктор по умолчанию (без параметров) создает пустую строку.
string(string & S) — копия строки S
string(int n, char c) — повторение символа c заданное число n раз.
string(char c) — строка из одного символа c .
string(string & S, int start, int len) — строка, содержащая не более, чем len символов данной строки S , начиная с символа номер start .
Конструкторы можно вызывать явно, например, так:
В этом примере явно вызывается конструктор string для создания строки, состоящей из 10 символов ‘z’ .
Неявно конструктор вызывается при объявлении строки с указанием дополнительных параметров. Например, так:
Подробней о конструкторах для строк читайте здесь.
Видео:Линейная алгебра. Векторы и операции над векторами.Скачать
Методы для строк
Методом называется функция, которая применяется к объекту, например, строке. При вызове метода его имя пишется после идентификатора объекта через точку, например, у объекта типа string есть метод size , возвращающий длину строки. Если S — это строка, то метод вызывается так: S.size() . Другой пример: метод substr возвращает подстроку заданной строки:
В данном случае будет выведен текст world .
Вот список полезных методов, применяемых к строкам:
append | добавляет строку или символы к строке |
assign | присваивает строке значение строк символов или других строк C++ |
clear | удаляет все символы из строки |
compare | сравнивает две строки |
empty | возвращает true если в строке нет символов |
erase | удаляет символы из строки |
find | ищет символы в строке |
find_first_not_of | находит первый символ, отличный от |
find_first_of | находит первый символ схожий с |
find_last_not_of | находит последний символ, отличный от |
find_last_of | находит последний символ, схожий с |
insert | вставляет символы в строку |
length | возвращает длину строки |
npos | специальное значение, означающее «не найдено» или «все оставшиеся символы» |
push_back | добавляет символ в конец строки |
replace | заменяет символы в строке |
resize | меняет размер строки |
rfind | находит последнее вхождение подстроки |
size | возвращает количество символов в строке |
substr | возвращает определённую подстроку |
swap | меняет две строки содержимым |
Для обозначения того, что запрашиваемая последовательность символов не найдена, многие методы (например, find ) возвращают специальную константу string::npos .
Видео:Программирование на С++. Урок 70. ВекторСкачать
Упражнения
A: Есть ли символ @
Дана строка (считывается при помощи getline). Если в этой строке есть символ @ , то выведите YES , иначе выведите NO .
Используйте метод find , для поиска символа в строке.
Ввод | Вывод |
---|
B: Есть ли гласная
Дана строка (считывается при помощи getline). Если в этой строке есть заглавная или строчная гласная буква (A, O, I, U, E, Y) то выведите YES , иначе выведите NO .
Используйте метод find_first_of , для поиска гласной в данной строке.
Ввод | Вывод |
---|
C: Подсчитайте количество символов @
Подсчитайте, сколько раз в данной строке встречается символ @.
Указание: используйте метод find , запоминая последнюю позицию найденного символа @ и продолжая поиск только с этой позиции. Подсчитывайте количество успешно завершенных поисков.
Примечание: решения, в которых на каждом шаге метод find вызывается дважды, приниматься не будут.
Ввод | Вывод |
---|
D: Подсчитайте количество гласных
Подсчитайте количество заглавных и строчных гласных букв в данной строке. Воспользуйтесь предыдущей задачей, заменив метод find на find_first_of .
Ввод | Вывод |
---|
E: Поиск подстроки
Даны две строки (с пробелами). Выведите YES , если вторая строка встречается внутри первой, иначе выведите NO .
Ввод | Вывод |
---|
F: Сколько раз одна подстрока находится внутри другой?
Даны две строки. Подсчитайте, сколько раз вторая строка встречается в первой, как ее подстрока. “Пересекающиеся” вхождения считаются несколько раз.
Ввод | Вывод |
---|
G: Вычеркнуть буквы
Даны две строки. Определите, можно ли из первой строки удалить несколько символов так, чтобы получилась вторая строка. Выведите YES или NO .
Ввод | Вывод |
---|
H: Пробелы после запятой
После запятой в тексте должен строять пробел. Дана строка, вставкой пробелов в неё добейтесь выполнения этого правила. Не надо вставлять пробел, если он там уже есть.
Ввод | Вывод |
---|
I: Продублировать гласные буквы
Дана строка. Продублируйте в ней все гласные буквы.
Ввод | Вывод |
---|
J: Удалите все символы @
Дана строка (считывается при помощи getline). Удалите из нее все символы @ , находя их при помощи метода find и удаляя их при помощи метода erase .
Не забывайте, что поиск нужно продолжать с места последнего нахождения данного символа, а не с начала строки!
Ввод | Вывод |
---|
K: Удалите все гласные буквы
Удалите из заданной строки все гласные буквы.
Ввод | Вывод |
---|
L: Удалить все вхождения слова
Даны две строки. Удалите из первой строки все вхождения данного слова. После удаления слова поиск следующего вхождения начинается со следующего символа за удаленным словом (то есть если в результате удаления слова образуется еще одно такое же слово, то его удалять не надо).
Ввод | Вывод |
---|
M: Удалить все внутри скобок
Дана строка. Удалите в ней все пары круглых скобок, вместе со всем их содержимым.
После нахождения открывающейся скобки программа должна найти ближайшую закрывающуюся скобку и удалить эти две скобки вместе со всем, что находится внутри. Отдельные закрывающиеся скобки игнорируются. Незакрытые открывающиеся скобки также игнорируются.
Ввод | Вывод |
---|
N: Замените 1 на one везде
В некоторой строке замените все символы 1 на слово one . Используйте методы find и replace .
Ввод | Вывод |
---|
O: Заменить все вхождения слова
Даны три строки. Найдите в первой строке все вхождения второй строки и замените их на третью строку. Поиск продолжается начиная с символа, следующего за замененным (то есть если в результате замены образуется новое вхождения искомой строки, то ее менять не надо).
Ввод | Вывод | |||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
MooMoo Mo Mooo P: Удалите лишние пробелыДана строка. Удалите все лишние пробелы: из начала строки, из конца строки и повторяющиеся пробелы внутри строки. Обязательно выводите конец строки после вывода самой строки!
Q: Поменять два слова местамиПрограмма получает на вход строку, состоящую из двух слов, разделенных пробелом (слово любая последовательность непробельных символов). Создайте строку, полученную из данной перестановкой слов и выведите ее. Код, подобный такому, приниматься не будет: Не забывайте выводить символ конца строки!
R: Пословное обращение строкиСтрока состоит из слов, разделенных пробелами. Создайте строку, полученную из данной перестановкой всех слов в обратном порядке и выведите результат.
S: СмайликиНапишите программу, которая посчитает количество смайликов в заданном тексте. Смайликом будем считать последовательность символов, удовлетворяющую условиям:
Например, нижеприведенные последовательности являются смайликами: в то время как эти последовательности смайликами не являются (хотя некоторые из них содержат смайлики): В этой задаче надо будет посчитать количество смайликов, содержащихся в данном тексте. Вводится одна строка текста, которая может содержать маленькие латинские буквы, пробелы, символы, которые могут встречаться в смайликах. Длина строки не превышает 100000 символов. Выведите одно число — количество смайликов, которые встречаются в тексте.
T: Выравнивание по левому краюПервая строка входного файла содержит целое число N. Далее (начиная со следующей строки) идет текст, который может содержать много строк. Необходимо данный текст разбить на строки, длина которых не превосходит N и вывести его в файл. В каждой выведенной строке не должно быть пробелов в начале строки, пробелов в конце строки, слова в строке должны разделяться одним пробелом. При этом каждая строка должна быть максимально длинной, то есть строки формируются по “жадному” принципу: добавляем слова из входного файла до тех пор, пока длина полученной строки не превышает N, после этого ставим разрыв строки. Гарантируется, что во входном файле нет слов длиннее N символов.
U: Выравнивание по ширинеРешите предыдущую задачу при условии, что текст в выводе программы должен быть выровнен по ширине: первый и последний символ строки должны быть непробельными, при необходимости между словами должны быть добавлены дополнительные пробелы, при этом количество пробелов между любыми двумя словами в одной строке не должно отличаться более, чем на 1. Последняя строка в выводе должна быть выровнена по левому краю.
V: Правила оформления программДана строка, содержащее арифметическое выражение на языке C. Строка может содержать только следующие символы: пробелы, цифры, латинские буквы, знаки + , — , * , / , % , = , ( , ) , , (запятая). Гарантируется, что записанное арифметическое выражение синтаксически корректно и может содержать следующие лексемы:
Расставьте в этом выражении пробелы в соответствии с правилами оформления программ:
После вывода выражения не забудьте вывести символ конца строки.
W: Действительное числоВещественное число задается следующим образом (форма Бэкуса-Наура): В форме Бэкуса-Наура знак ::= означает определение, например, ::= ‘+’ | ‘-‘ означает, что понятие Sign — это один из двух символов + или + . Значение в квадратных скобках означает, что это значение может встречаться, а может и не встречаться, а значение в фигурных скобках означает, что это выражение может быть записано 0, 1 или большее количество раз подряд. Например, записать [ ] означает Sign , который может присутсвовать или отсутствовать, за которым идет digit , повторенная 1 или более раз. Программа получает на вход одну строку, содержащащей не более 200 символов. Выведите YES , если эта строка является корректной записью действительного числа в соответствии с данным определением, или NO , в противном случае.
X: Значение выраженияЗадано числовое выражение. Необходимо вычислить его значение или установить, что оно содержит ошибку. В правильном выражении могут встречаться знаки сложения, вычитания, умножения, скобки и пробелы (пробелов внутри чисел быть не должно). Приоритет операций стандартный. Все числа в выражении целые и принадлежат диапазону int . Также гарантируется, что все промежуточные вычисления умещаются в этот тип. В первой строке вводится выражение. Его длина не превосходит 100 знаков. После выражения идет переход на новую строчку. Выведите значение этого выражения или слово WRONG , если значение не определено.
Y: EuroEnglishЕвропейская комиссия планирует принять решение о том, что официальным языком Евросоюза станет английский. Был также разработан план упрощения английской письменности, который планируется реализовать за четыре года. Первоочередной задачей будет избавление от буквы c , которая в сочетаниях сi и сe будет изменяться на s , в сочетании ck — опускаться, а в остальных случаях заменяться на k . При этом все замены будут производиться в строгом порядке слева направо. То есть, например, в слове success сначала первая из двух букв c заменится на k , а затем вторая — на s , то есть получится suksess . А слово cck превратится в kk . На второй год из английских слов изымут все удвоенные буквы: ee изменят на i , oo — на u , a в остальных комбинациях будут просто писать одну букву вместо двух одинаковых. Такие замены также будут делать строго в порядке слева направо. Так, слово ooo превратится в uo , а oou — просто в u (в нем сначала oo заменится на u , а затем uu — на u ), слово iee превратится в i (в нем сначала ee заменится на i , а затем ii — на i ). На третий год на конце слова станут опускать букву е , если эта буква не является единственной буквой в слове. Наконец, завершением реформы станет отмена артиклей (в английском языке три артикля: а , an и the ). При этом удаляться эти артикли будут только тогда, когда они в исходном тексте были словами a, an, the. То есть, например, текст the table после реформ первых трех лет превратиться в th tabl , а после реформы четвертого года — просто в tabl . А слово aaaaa после реформы первых лет станет словом a , но поскольку изначально оно не было словом a (артиклем), то оно в итоге так и останется словом a . Напишите программу, которая будет переводить классический английский текст на Eвроинглиш. Во входном файле записана одна строка текста, состоящая не более чем из 200 символов: латинских строчных и заглавных букв, пробелов и знаков препинания (в тексте могут встречаться: точка, запятая, вопросительный и восклицательный знаки, двоеточие, тире, точка с запятой, открывающаяся и закрывающаяся скобки, апострофы, кавычки). Заглавные буквы могут встречаться только в начале слова. Нигде подряд не могут стоять два пробела. В начале и в конце строки не может стоять пробел. Слова отделяются друг от друга пробелами и/или знаками препинания. В выходной файл нужно выдать преобразованную строку с учетом следующих требований:
Z: Форматирование текстаМногие системы форматирования текста, например TEX или Wiki, используют для разбиения текста на абзацы пустые строки. Текст представляет собой последовательность слов, разделенных пробелами, символами перевода строк и следующими знаками препинания: «,», «.», «?», «!», «-», «:» и «’» (ASCII коды 44, 46, 63, 33, 45, 58, 39). Каждое слово в тексте состоит из заглавных и прописных букв латинского алфавита и цифр. Текст может состоять из нескольких абзацев. В этом случае соседние абзацы разделяются одной или несколькими пустыми строками. Перед первым абзацем и после последнего абзаца также могут идти одна или несколько пустых строк. Дальнейшее использование исходного текста предполагает его форматирование, которое осуществляется следующим образом. Каждый абзац должен быть разбит на строки, каждая из которых имеет длину не больше (w). Первая строка каждого абзаца должна начинаться с отступа, состоящего из (b) пробелов. Слова внутри одной строки должны быть разделены ровно одним пробелом. Если после слова идет один или несколько знаков препинания, они должны следовать сразу после слова без дополнительных пробелов. Если очередное слово вместе со следующими за ним знаками препинания помещается на текущую строку, оно размещается на текущей строке. В противном случае, с этого слова начинается новая строка. В отформатированном тексте абзацы не должны разделяться пустыми строками. В конце строк не должно быть пробелов. Требуется написать программу, которая по заданным числам (w) и (b) и заданному тексту выводит текст, отформатированный описанным выше образом. Первая строка входного файла содержит два целых числа: (w) и (b) ((5 le w le 100) , (1 le b le 8) , (b lt w)). Затем следует одна или более строк, содержащих заданный текст. Длина слова в тексте вместе со следующими за ними знаками препинания не превышает (w) а длина первого слова любого абзаца вместе со следующими за ним знаками препинания не превышает (w — b). Размер входного файла не превышает 100 Кбайт. Длина каждой строки во входном файле не превышает 250. Выходной файл должен содержать заданный текст, отформатированный в соответствии с приведенными в условии задачи правилами.
ZA: Химические реакцииБилл преподаёт химию в школе, он подготовил несколько тестов для учеников. Каждый тест состоит из химической формулы и нескольких возможных результатов реакции. Среди этих результатов ученики должны выбрать правильный. Билл хочет убедиться в том, что, вводя свои тесты в компьютер, он не допустил опечаток, благодаря которым ученики могли бы отбросить неверные ответы, просто подсчитав число химических элементов в левой и правой частях уравнения (в правильном уравнении химической реакции должно соблюдаться равенство). Напишите программу, которая поможет Биллу. Программа должна прочитать описание теста, состоящее из заданной левой части уравнения и нескольких возможных правых частей, и определить, равно ли количество химических элементов в каждой предложенной правой части уравнения количеству химических элементов в заданной левой части. Билл формализовал задачу. И левая, и правая части уравнения представлены строкой символов без пробелов, состоящей из одной или более химических последовательностей, разделённых знаком плюс. Каждая последовательность имеет необязательный предшествующий целый множитель, относящийся ко всей последовательности, и несколько элементов. Каждый элемент может сопровождаться необязательным целым множителем, относящимся к нему. Элемент в этом уравнении может быть или отдельным химическим элементом, или целой последовательностью в круглых скобках. Каждый отдельный химический элемент представлен или одной прописной буквой, или прописной буквой, сопровождаемой строчной. Ещё более формально, используя нотацию, аналогичную форме Бэкуса-Наура, можно написать:
Будем говорить, что каждый отдельный химический элемент встречается в формуле всего X раз, если X — сумма всех различных вхождений этого химического элемента, умноженных на все числа, относящиеся к ним. Например, в формуле C2H5OH+3O2+3(SiO2)
Все множители в формулах — целые числа не меньше 2, если заданы явно, или равны 1 — по умолчанию. В первой строке входных данных находится формула — левая часть уравнения, во второй — одно число N — количество рассматриваемых правых частей, в каждой из следующих N строк — одна формула — предлагаемая правая часть уравнения. Ограничения: 1 должна быть замещена посимвольной копией формулы левой части, как она дана в первой строке входного файла, а — замещена точной копией формулы правой части, как она дана во входном файле. В строках не должно быть пробелов.
|