Перейти к содержимому

Include sstream c что это такое

  • автор:

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 stringstream container; // создали специальный поток ввода/вывода, // который «работает» в некоторой области памяти string data = «918»; int x; container.clear(); // на случай, если в container что-то лежало, чтобы // случайно не попало в результат преобразования container > x; // достаем из потока это же число в виде int

2. Функция sscanf() (scan from string as fromatted). Данная функция также из обычного C (не C++) поэтому «умеет» работать только с символьными массивами. В грубом приближении у функции 3 параметра: символьный массив, строка формата и переменная (или переменные), куда следует поместить результаты преобразования.

#include string some_value = 825; x = sscanf(some_value.data(), «%d», &x); // в x записано число типа int, извлеченное из строки // функция data() позволяет получить символьный массив // в формате языка C (не C++), с таким же содержанием, // что и строка

Преобразование числа к строке

1. Ввод/вывод в stringstream. Требуется создать специальный поток ввода/вывода, который будет вводить или выводить данные в некоторый буффер в памяти. При этом операции будут сходны со стандартным вводом/выводом.

#include #include #include using namespace std; stringstream container; // создали специальный поток ввода/вывода, // который «работает» в некоторой области памяти string data; int x = 16; container.clear(); // объясняем потоку, что в нем нет данных // чтоб не получить при чтении то, что не клали туда сами container > data; // достаем из потока это же число в виде строки

2. sprintf() (print formatted to string). Эта функция также является функцией из стандартного C, и тоже работает только с массивами из char). Параметры (вкратце): символьный массив, куда будет выведен результат, строка формата, данные.

Подробнее про строку формата см. например, здесь.

#include #include #include int x; string s; char z[100]; x = 92; sprintf(z, «%d», x); s = z;

Строка как массив символов

Строку можно рассматривать как массив символов и применять к ней методы работы, как с массивом.

Что делает 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

Сортировка: Сброс на вариант по умолчанию

  1. stringstream — это такой же stream , как и, например, cin , только его содержимое берётся не из входного потока программы, а из данной ему строки. Эффект от вашего кода в принципе такой же, как от while (cin >> input) , если бы пользователь ввёл содержимое input вручную (но программа не останавливается в ожидании ввода). Заметьте, что переменная input используется дважды: один раз чтобы инициализировать stringstream , а потом в цикле читая куски этого самого stringstream . (Это не очень красиво, я бы не пожалел объявить для нового смысла новую переменную.)
  2. Это вначале строка 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.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *