Include sstream c что это такое
Определяет несколько шаблонов классов, поддерживающих операции iostreams с последовательности, хранящиеся в выделенном объекте массива. Такие последовательности легко преобразуются в объекты шаблона класса и из них basic_string.
Синтаксис
namespace std < template , class Allocator = allocator> class basic_stringbuf; typedef basic_stringbuf stringbuf; typedef basic_stringbuf wstringbuf; template , class Allocator = allocator> class basic_istringstream; typedef basic_istringstream istringstream; typedef basic_istringstream wistringstream; template , class Allocator = allocator> class basic_ostringstream; typedef basic_ostringstream ostringstream; typedef basic_ostringstream wostringstream; template , class Allocator = allocator> class basic_stringstream; typedef basic_stringstream stringstream; typedef basic_stringstream wstringstream; // TEMPLATE FUNCTIONS template void swap( basic_stringbuf& left, basic_stringbuf& right); template void swap( basic_istringstream& left, basic_istringstream& right); template void swap( basic_ostringstream& left, basic_ostringstream& right); template void swap ( basic_stringstream& left, basic_stringstream& right); > // namespace std
Параметры
left
Ссылка на объект sstream .
right
Ссылка на объект sstream .
Замечания
Определения типов
| Введите имя | Description |
|---|---|
| istringstream | Создает тип basic_istringstream , специализированный на параметре шаблона char . |
| ostringstream | Создает тип basic_ostringstream , специализированный на параметре шаблона char . |
| stringbuf | Создает тип basic_stringbuf , специализированный на параметре шаблона char . |
| stringstream | Создает тип basic_stringstream , специализированный на параметре шаблона char . |
| wistringstream | Создает тип basic_istringstream , специализированный на параметре шаблона wchar_t . |
| wostringstream | Создает тип basic_ostringstream , специализированный на параметре шаблона wchar_t . |
| wstringbuf | Создает тип basic_stringbuf , специализированный на параметре шаблона wchar_t . |
| wstringstream | Создает тип basic_stringstream , специализированный на параметре шаблона wchar_t . |
Манипуляторы
| Имя | Описание |
|---|---|
| swap | Меняет местами значения двух объектов sstream . |
Классы
| Класс | Description |
|---|---|
| basic_stringbuf | Описывает буфер потока, который управляет передачей элементов типа Elem , признаки символов которого определяются с помощью класса Tr , в последовательность элементов, сохраненную в объекте массива, и из нее. |
| basic_istringstream | Описывает объект, который управляет извлечением элементов и закодированных объектов из буфера потока класса basic_stringbufElem, Tr, Alloc >с элементами типа Elem , признаки символов которых определяются классом Tr , и элементы которых выделяются распределителем класса. Alloc |
| basic_ostringstream | Описывает объект, который управляет вставкой элементов и закодированных объектов в буфер потока класса basic_stringbufElem, Tr, Alloc >с элементами типа Elem , признаки символов которых определяются классом Tr , и элементы которых выделяются распределителем класса. Alloc |
| basic_stringstream | Описывает объект, который управляет вставкой и извлечением элементов и закодированных объектов с помощью буфера потока класса basic_stringbufElem, Tr, Alloc >с элементами типа Elem , признаки символов которых определяются классом Tr , и элементы которых выделяются распределителем класса. Alloc |
Типы данных
Строки Прежде чем пользоваться строковыми операциями и вообще иметь возможность описывать переменные типа string необходимо включить в заголовок программы описание:
Также во всех примерах предполагается, что в начале программы подключено пространство имен std:
using namespace std;
Описание строки полностью аналогично описанию любой другой переменной. Например:
string example_str;
- Присваивание
- Сравнение
- Ввод
- Запрос длины строки (size, length)
- Соединение (+)
- Удаление фрагмента (erase)
- Вставка фрагмента (insert)
- Копирование фрагмента (substr)
- Поиск фрагмента (find)
- Преобразование к числу (sscanf, sstream)
- Преобразование числа к строке (sprintf, sstream)
- Строка как массив символов
- Примечание(*)
Присваивание строк
Примеры с комментариями:
string example_str = «Do bats eat cats?»; // присваивание при описании example_str = «»; // присваивание пустой строки — // две кавычки рядом, без пробелов work_str = example_str; // присваивание между строками
Помимо этого возможно вот такое присваивание:
char a[50]; example_str = a;
Сравнение строк
Две строки равны друг другу, если у них одинаковые длины и символы на соответствующих местах полностью совпадают (то есть 1-й символ строки A равен 1-му символу строки B, 2-й символ строки A равен 2-му символу строки B и так далее)
Например строка «abc» равна строке «abc», но не равна строке «abcd».
Выяснение какая из строк больше выполняется посимвольно, аналогично алфавитному порядку русского языка. Если строка начинается с символа, чей код больше, что и сама строка больше. Если первые символы одинаковы, то сравниваются вторые символы по тому же правилу. Если и они одинаковы, сравниваются третьи и так далее. Если в процессе сравнения какая-то из строк закончилась, то она меньше другой.
Строку также можно сравнивать с пустой (обозначается двумя кавычками подряд, без пробелов).
while (example_str != «») < // какие-то команды >
Для ввода строк рекомендуется использовать функцию getline(). Данная функция читает строку целиком (с пробелами и прочими символами) до знака перевода строки.
getline(cin, example_str);
Длина строки
Функции size() или length() возвращают целое число — количество символов, которое сейчас находится в строке.
example_str = «Password»; int x = example_str.size(); // после этого фрагмента x = 8
example_str = «»; if (example_str.length() > 0) < // команды этого блока сейчас не выполнятся, // так как длина пустой строки равна 0 >;
Соединение строк
Операция + возвращает строку, получившуюся в результате соединения (дописывания одной строки после конца другой) одной или более строк. Строки соединяются в том порядке, как они указаны в операции.
example_str = «password»; article = «The » comment_str = «anyone can guess it.» example_str = article + example_str + » is so simple, so » + comment_str; // example_str = «The password is so simple, so anyone can guess it.»
Удаление фрагмента
Функция erase() удаляет указанный фрагмент строки (если это возможно). Первым параметром указывается начальный символ (с него начнется удаление), вторым — количество символов. Символы в строке нумеруются, начиная с 0.
example_str = «The star is so distant»; example_str.erase(3, 6); // example_str = «Theis so distant» // будет удалено слово star вместе с обоими пробелами
example_str = «The star is so distant»; example_str.erase(3, 80); // example_str = «The» // будет удалено столько символов, сколько возможно
Вставка фрагмента
С помощьью функции insert() можно добавить заданный фрагмент в любое место строки. Первым параметром функции является номер начальной позиции для фрагмента (нумерация начинается с 0), вторым — фрагмент. Функция изменяет исходную строку.
example_str = «123456»; example_str.insert(3, «+»); // теперь example_str = «123+456»
Копирование фрагмента
Функция substr() возвращает фрагмент строки (который тоже является строкой). Первым параметром указывается номер начального символа, вторым — количество. Символы нумеруются, начиная с 0. Функция не оказывает влияния на исходную строку.
example_str = «Do bats eat cats?»; new_str = example_str.substr(3, 5); // new_str = «bats » // будет скопировано слово «bats» вместе с последуюшим пробелом
example_str = «Do bats eat cats?»; new_str = example_str.substr(12, 100); // new_str = «cats?» // в строке нет 100 символов, поэтому будет скопировано сколько есть
Поиск фрагмента
С помощью функции find() можно определить, встречается ли данный фрагмент в строке. Функция возвращает специальное значение string::npos, если фрагмент не найден или номер первого (начиная слева) места, откуда начинается подобный фрагмент
example_str = «comandante@cia.dark.org»; x = example_str.find(«z»); // в этом примере x равно string::npos, // так как в строке нет ни одной буквы z
example_str = «comandante@cia.dark.org»; x = example_str.find(«a»); // в этом примере x равно 3, // символов «а» в строке несколько, но find // вернет номер только для первого слева
example_str = «comandante@cia.dark.org»; if (example_str.find(«te») != string::npos) < // команды этого блока выполнятся, так как // в строке есть фрагмент "te" >
Преобразование к числу
1. Ввод/вывод в stringstream. Требуется создать специальный поток ввода/вывода, который будет вводить или выводить данные в некоторый буффер в памяти. При этом операции будут сходны со стандартным вводом/выводом.
#include
2. Функция sscanf() (scan from string as fromatted). Данная функция также из обычного C (не C++) поэтому «умеет» работать только с символьными массивами. В грубом приближении у функции 3 параметра: символьный массив, строка формата и переменная (или переменные), куда следует поместить результаты преобразования.
#include
Преобразование числа к строке
1. Ввод/вывод в stringstream. Требуется создать специальный поток ввода/вывода, который будет вводить или выводить данные в некоторый буффер в памяти. При этом операции будут сходны со стандартным вводом/выводом.
#include
2. sprintf() (print formatted to string). Эта функция также является функцией из стандартного C, и тоже работает только с массивами из char). Параметры (вкратце): символьный массив, куда будет выведен результат, строка формата, данные.
Подробнее про строку формата см. например, здесь.
#include
Строка как массив символов
Строку можно рассматривать как массив символов и применять к ней методы работы, как с массивом.
Что делает stringstream и не только?
По логике программы, так понимаю, что я ввожу строку ss, после чего включается цикл и по одному слову оно начинает передавать из ss в input? Вторая беда вот эта.
if(input.front() == input.back()) < size_t found = output.find(input); if (found == string::npos) < output.append(input); output.append(" "); >>
И так проверяет в слове, равны ли первый и последний символ. Дальше непонятно. Строка output пустая, как оно может в ней искать подстроку input?
В общем, можно поподробней разъяснить, как тут все работает?
Отслеживать
11 1 1 золотой знак 2 2 серебряных знака 8 8 бронзовых знаков
задан 9 окт 2014 в 17:23
23 1 1 золотой знак 1 1 серебряный знак 3 3 бронзовых знака
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
- stringstream — это такой же stream , как и, например, cin , только его содержимое берётся не из входного потока программы, а из данной ему строки. Эффект от вашего кода в принципе такой же, как от while (cin >> input) , если бы пользователь ввёл содержимое input вручную (но программа не останавливается в ожидании ввода). Заметьте, что переменная input используется дважды: один раз чтобы инициализировать stringstream , а потом в цикле читая куски этого самого stringstream . (Это не очень красиво, я бы не пожалел объявить для нового смысла новую переменную.)
- Это вначале строка output пустая, а после первого раза в ней добавится текст. Попробуйте протрассировать программу для такой исходной строки: «one one ne two two» , вам сразу станет яснее.
Отслеживать
ответ дан 9 окт 2014 в 17:50
207k 28 28 золотых знаков 293 293 серебряных знака 526 526 бронзовых знаков
Т.е. я ввожу «text text», начинается и заканчивается одним и тем же символом. if (found == string::npos) это условие в 1, когда в строке output нет подстроки input. Получается, первый раз в пустой строке нету text, поэтому оно зайдет в условие. А в следующий раз уже нет? Так?
Include sstream c что это такое
Ссылка (reference) представляет способ манипулировать каким-либо объектом. Фактически ссылка — это альтернативное имя для объекта. Для определения ссылки применяется знак амперсанда &:
int number ; int &refNumber ;
В данном случае определена ссылка refNumber, которая ссылается на объект number. При этом в определении ссылки используется тот же тип, который представляет объект, на который ссылка ссылается, то есть в данном случае int.
При этом нельзя просто определить ссылку:
Она обязательно должна указывать на какой-нибудь объект.
Также нельзя присвоить ссылке литеральное значение, например, число:
После установления ссылки мы можем через нее манипулировать самим объектом, на который она ссылается:
#include int main() < int number ; int &refNumber ; std::cout
Изменения по ссылке неизбежно скажутся и на том объекте, на который ссылается ссылка.
Можно определять не только ссылки на переменные, но и ссылки на константы. Но при этом ссылка сама должна быть константной:
const int number; const int &refNumber; std::coutИнициализировать неконстантную ссылку константным объектом мы не можем:
const int number ; int &refNumber ; // ошибкаТакже константная ссылка может указывать и на обычную переменную, только значение по такой ссылке мы не сможем изменить:
int number ; const int &refNumber ; std::coutВ данном случае несмотря на то, что мы не можем напрямую изменить значение по константной ссылке, тем не менее мы можем изменить сам объект, что приведет естественно к изменению константной ссылки.
ссылки в цикле for
В большинстве случае ссылки находят свое применение в функциях, когда надо передать значения по ссылке, что будет рассмотрено в последующих статьях. Однако есть и другие сценарии использования ссылок. Например, в цикл for , который перебирает последовательность в стиле "for-each", мы не можем изменить значения перебираемых элементов. Например:
#include int main() < int numbers[] ; // меняем число на его квадрат for (auto n : numbers) < n = n * n; >// смотрим результат for (auto n : numbers) < std::cout std::coutЗдесь два цикла. В первом цикле при переборе массива помещаем каждый элемент массива в переменную n и изменяем ее значение на квадрат числа. Однако это приведет только к изменению этой переменной n, но никак не элементов перебираемого массива numbers. Элементы массива сохранят свои значения, что нам и покажет второй цикл, который выводит элементы на консоль:
1 2 3 4 5Теперь используем ссылки:
#include int main() < int numbers[] ; // теперь n - ссылка на элемент массива for (auto& n : numbers) < n = n * n; >// смотрим результат for (auto n : numbers) < std::cout std::cout
Теперь в первом цикле переменная n представляет ссылку на элемент массива. Использование ссылки позволяет оптимизировать работу с циклом, поскольку теперь значение элемента массива не копируется в переменную n. И через ссылку можно изменить значение соответствующего элемента:
1 4 9 16 25Иногда, наоборот, не нужно или даже нежелательно изменять элементы коллекции. В этом случае мы можем сделать ссылку константной:
#include int main() < int numbers[] ; // n - константная ссылка for (const auto& n : numbers) < std::cout std::cout
Хотя здесь мы не можем изменять значение элемента, но также с помощью ссылок оптимизируем перебор массива, так как элементы массива не копируются в переменную n.