C++. Сборник рецептов
Шрифт:
map
определяет operator[]
, позволяющий получить значение данного ключа (на самом деле он возвращает ссылку на само значение), так что для его инкремента просто инкрементируется значение, индексируемое с помощью заданного ключа. Но здесь могут возникнуть небольшие осложнения. Что, если ключа в map еще нет? Разве мы не попытаемся увеличить несуществующий элемент, и не обрушится ли программа, как в случае с обычным массивом? Нет, map
определяет operator[]
не так, как другие контейнеры STL
В
map operator[]
делает две вещи: если ключ еще не существует, он создает значение, используя конструктор типа значения по умолчанию, и добавляет в map
эту новую пару ключ/значение, а если ключ уже существует, то никаких изменений не вносится. В обоих случаях возвращается ссылка на значение, определяемое ключом, даже если это значение было только что создано конструктором по умолчанию. Это удобная возможность (если вы знаете о ее существовании), так как он устраняет необходимость проверки в клиентском коде существования ключа перед его добавлением. Теперь посмотрите на строки 32 и 33. Итератор указывает на члены, которые называются
first
и second
— что это такое? map
обманывает вас, используя для хранения пар имя/значение другой шаблон класса: шаблон класса pair
, определенный в <utility>
(уже включенный в <map>
). При переборе элементов, хранящихся в map
, вы получите ссылки на объекты pair
. Работа с pair
проста. Первый элемент пары хранится в элементе first
, а второй хранится, естественно, в second
. В примере 4.27 я для чтения из входного потока непрерывных фрагментов текста использую
operator>>
, что отличается от некоторых других примеров. Я делаю это для демонстрации того, как это делается, но вам почти наверняка потребуется изменить его поведение в зависимости от определения «слова» текстового файла. Например, рассмотрим фрагмент вывода, генерируемого примером 4.27. with присутствует 5 раз.
work присутствует 3 раз.
workers присутствует 3 раз.
workers, присутствует 1 раз.
years присутствует 2 раз.
years, присутствует 1 раз.
Обратите внимание, что точки в конце слов рассматриваются как части слов. Скорее всего, вам потребуется с помощью функций проверки символов из
<cctype>
и <cwctype>
изменить определение слова так, чтобы оно означало только буквенно-цифровые символы, как это сделано в рецепте 4.17. Смотри также
Рецепт 4.17 и табл. 4.3.
4.19. Добавление полей в текстовый файл
Проблема
Имеется текстовый файл, и в нем требуется сделать поля.
Решение
Пример 4.28 показывает, как добавить в файл поля с помощью потоков,
string
и шаблона функции getline
. Пример 4.28. Добавление полей в текстовый файл
#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib>
using namespace std;
const static char PAD_CHAR = '.';
// addMargins принимает два потока и два числа. Потоки используются для
// ввода и вывода. Первое из двух чисел представляет
// ширину левого поля (т.е. число пробелов, вставляемых в
// начале каждой строки файла). Второе число представляет
// общую ширину строки.
void addMargins(istream& in, ostream& out,
int left, int right) {
string tmp;
while (!in.eof) {
getline(in, tmp, '\n'); // getline определена
// в <string>
tmp.insert(tmp.begin, left, PAD_CHAR);
rpad(tmp, right, PAD_CHAR); // rpad из рецепта
// 4.2
out << tmp << '\n';
}
}
int main(int argc, char** argv) {
if (argc < 3)
return(EXIT_FAILURE);
ifstream in(argv[1]);
ofstream out(argv[2]);
if (!in || !out)
return(EXIT_FAILURE);
int left = 8;
int right = 72;
if (argc == 5) {
left = atoi(argv[3]);
right = atoi(argv[4]);
}
addMargins(in, out, left, right);
out.close;
if (out)
return(EXIT_SUCCESS);
else
return(EXIT_FAILURE);
Поделиться:
Популярные книги
Кротовский, не начинайте
2. РОС: Изнанка Империи
Фантастика:
городское фэнтези
попаданцы
альтернативная история
5.00
рейтинг книги
Вадбольский
1. Вадбольский
Фантастика:
попаданцы
5.00
рейтинг книги
Истребители. Трилогия
Фантастика:
альтернативная история
7.30
рейтинг книги
Законник Российской Империи. Том 4
4. Словом и делом
Фантастика:
городское фэнтези
альтернативная история
аниме
дорама
5.00
рейтинг книги
Пятнадцать ножевых 4
4. 15 ножевых
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Адаптация
2. Гардемарин ее величества
Фантастика:
городское фэнтези
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Имперский Курьер. Том 4
4. Запечатанный мир
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Его огонь горит для меня. Том 2
2. Мир Карастели
Фантастика:
юмористическая фантастика
5.40
рейтинг книги
Кодекс Крови. Книга VII
7. РОС: Кодекс Крови
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Локки 4 Потомок бога
4. Локки
Фантастика:
аниме
фэнтези
5.00
рейтинг книги
Хозяйственная помощница для идеала
15. Помощница
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Газлайтер. Том 19
19. История Телепата
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Три `Д` для миллиардера. Свадебный салон
Любовные романы:
современные любовные романы
короткие любовные романы
7.14
рейтинг книги
Студиозус 2
4. Светлая Тьма
Фантастика:
юмористическое фэнтези
городское фэнтези
аниме
5.00