3 / 3 / 0
Регистрация: 28.11.2018
Сообщений: 242
1

Что быстрее работает string или sstream?

01.11.2020, 14:52. Показов 2868. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Давно уже вижу как используют эти два класса
Но какая между ними потенциальная разница? По факту они делают одно и то же, только выглядит в коде это чуть иначе - это как я это вижу.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.11.2020, 14:52
Ответы с готовыми решениями:

Оптимизация. Что быстрее работает: cout или printf
Что быстрее работает: cout или printf ????????? Добавлено через 32 минуты ЕЩе вот что: Как...

что быстрее работает рекурсия или цикл
вопрос чисто академический:) что быстрее работает рекурсия или цикл. замеры производительности...

Что быстрее работает - активноть или popup окно
Что все таки быстрее строится, активность или popup окно? Вопрос вызван делемой что использовать...

Что работает быстрее, ввод с консоли или ввод с файла?
вводятся множество списков программа удаляет первое число списка и удаляет все числа в этом списке...

7
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
01.11.2020, 17:23 2
Цитата Сообщение от MJ_PRUTYG Посмотреть сообщение
Давно уже вижу как используют эти два класса
Но какая между ними потенциальная разница? По факту они делают одно и то же, только выглядит в коде это чуть иначе - это как я это вижу.
Ну, интерфейс у них вообще разный. Как-то слабо можно представить, чтоб одно можно было заменить другим
0
Неэпический
17869 / 10634 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
01.11.2020, 17:38 3
Цитата Сообщение от MJ_PRUTYG Посмотреть сообщение
Давно уже вижу как используют эти два класса
Цитата Сообщение от MJ_PRUTYG Посмотреть сообщение
sstream
В C++ такого класса нет. Есть заголовочный файл для "подключения" stringstream.
Цитата Сообщение от MJ_PRUTYG Посмотреть сообщение
По факту они делают одно и то же
Почему вы так решили? Этот как бы вообще разные вещи.

Листок - string
Карандаш - stringstream
0
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
01.11.2020, 18:56 4
Цитата Сообщение от MJ_PRUTYG Посмотреть сообщение
Давно уже вижу как используют эти два класса
sstream - название хэдера, а не класса.

Цитата Сообщение от MJ_PRUTYG Посмотреть сообщение
По факту они делают одно и то же
есть два хэдера: string и sstream
они содержат принципиально разный код,
принципиально разных механизмов.

есть два класса: std::string и std::stringstream
это - два принципиально разных класса,
которые делают принципиально разные вещи,
принципиально разными способами.

Цитата Сообщение от MJ_PRUTYG Посмотреть сообщение
это как я это вижу.
ты художник что ли?
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
01.11.2020, 21:43 5
Вероятно стоит задуматься над тем что понимают под "потоком" и для чего он нужен.
0
3 / 3 / 0
Регистрация: 28.11.2018
Сообщений: 242
01.11.2020, 22:47  [ТС] 6
Цитата Сообщение от Croessmah Посмотреть сообщение
В C++ такого класса нет. Есть заголовочный файл для "подключения" stringstream.
прошу прощения, быстро писал, перепутал. Да, я имел ввиду именно строковый поток - str::stringstream
Цитата Сообщение от Croessmah Посмотреть сообщение
Почему вы так решили? Этот как бы вообще разные вещи
Ну... Просто я вижу, что вся разница между string(дальше S) и str::stringstream(дальше SS) это в том, что для добавления в S используется метод append() или перегруженный оператор +=
А для SS используется перегруженный оператор <<, плюс ко всему еще не нужно морочиться с типом данных, он автоматом переводит int\float\char итд в строковый тип, без дополнительного использования std::to_string(в случае S)

Добавлено через 57 секунд
Цитата Сообщение от hoggy Посмотреть сообщение
принципиально разными способами
вот немного выше ответил Croessmah на счёт и вашего ответа. А интересует, что именно вы имеете ввиду под "принципиально разными способами"??? Хотелось бы узнать

Добавлено через 3 минуты
Цитата Сообщение от hoggy Посмотреть сообщение
ты художник что ли?
нет. Я это использую. Разницу в использовании какую вижу, такую и написал. Для меня лично, это вместо append()\+= используется просто << а записывает std::stringstream всё равно в тот же std::string который в нём находится(в std::stringstream-е)

Добавлено через 3 минуты
Цитата Сообщение от Avazart Посмотреть сообщение
Вероятно стоит задуматься над тем что понимают под "потоком" и для чего он нужен
Вероятно... Ну, я понимаю поток, как поток каких-то данных, будь то данные фильма, которые копируются с флешки на диск D, будь то данные строки, которые копируются с const char * в std::string который находится внутри std::stringstream
0
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
02.11.2020, 00:11 7
Лучший ответ Сообщение было отмечено MJ_PRUTYG как решение

Решение

Цитата Сообщение от MJ_PRUTYG Посмотреть сообщение
что именно вы имеете ввиду под "принципиально разными способами"?
вот есть вертолет. он летает.
есть автомобиль. он катиццо по земле.
есть подводная лодка. она плавает под водой.

это - принципиально разные способы перемещения.
они принципиально разные, потому что принцип действия у них различнный.


или вот такой пример:
есть "фломастер" - это такая штука, при помощи которой можно рисовать.

и есть "фиолетовый" - это вообще прилагательное. обозначет цвет предмета.

ну так вот, "фломастеры" и "фиолетовый" - принципиально разные вещи.
как "тёплое" с "мягким".


std::string и std::stringstream - прниципильно разные механизмы.
они предназначены для принципиально разных задач.

std::stringstream - поток данных.
как и любой другой поток, его задача: ввод/вывод данных.
ты знаешь что такое "поток данных" и зачем он нужен?


"поток данных" - это механизм, который абстрагирует тебя
от работы с реальным физическим устройством ввода/вывода.

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

Цитата Сообщение от MJ_PRUTYG Посмотреть сообщение
нет. Я это использую. Разницу в использовании какую вижу, такую и написал.
а рассуждаешь ты как самый настоящий художник.

Цитата Сообщение от MJ_PRUTYG Посмотреть сообщение
Для меня лично, это вместо append()\+= используется просто << а записывает std::stringstream всё равно в тот же std::string который в нём находится(в std::stringstream-е)
нет не все равно "в тот же std::string"

ты можешь извлечь данные из std::stringstream в виде std::string.
однако сам механизм std::stringstream не хранит внутри себя std::string.

внутри себя он хранит особый механизм - потоковый буффер,
который умеет непосредственно отправлять/получать байты
для/от конкретных устройств ввода/вывода.


концепция "потока данных" - это труба.
один конец держишь ты, в своей программе.
другой ведет на некоторое устройство.

раз ты - художник, попробую описать тебе идею в виде художественного образа.

представь себе трубу.
обычную длинную трубу.
представил?

ты держишь эту трубу за один конец.
а другой её конец воткнут в принтер.
прямо через корпус.

представил?

теперь ты берешь данные - какие то байты информации.
представь их себе в виде надписей на обрывках бумаги.

и вот ты берешь эти обрывки бумаги и забрасываешь их в трубу.
обрывки с информаций падают в трубу,
и вываливаются через другой конец прямо в принтер.

а принтер только и ждет когда из его конца трубы повалятся данные.
и вот когда из трубы начинает вываливаться информация,
принтер делает с ней то, что и должен сделать - распечатывает на бумаге.

главная изюминка такого подхода в том,
что тебе не нужно знать, как на самом деле происходит передача данных.
ты знай себе - запихивай в свой конец трубы данные,
а дальше все будет происходить как по волшебству:
данные можно отправить на принтер,
или в консоль, или в файл,
или в сокет отправить по сети,
и тп.

такой подход избавляет пользователей знать,
как на самом деле устроены физические устройства.




std::stringstream - это и есть вот такая вот труба,
через которую ты можешь передавать текстовую информацию.
все, что ты в неё запихиваешь преобразуется к текстовому виду,
и проталкивается на другой конец.

сама передача осуществляется руками потокового буффера,
который в свою очередь оперирует понятием "байты".
ему безразлично, что "байты" - это на самом деле текст.
его задача: вот что ему закинули в трубу, то нужно просто взять,
и запинать/протолкнуть на другой её конец.

такая архитектура позволяет перенаправлять данные одного потока в другой.

например, следующий код иллюстрирует,
как можно "перенаправить поток данных std::cout в текстовую переменную"

https://rextester.com/XGTL27218

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <iostream>
#include <sstream>
#include <cassert>
#include <string>
 
::std::stringstream g_stream;
::std::streambuf* g_old;
 
void beg_redirect()
{
    assert(::std::cout);
    assert(g_stream);
    g_old = ::std::cout.rdbuf(g_stream.rdbuf());
}
 
auto end_redirect()
{
    assert(::std::cout);
    assert(g_stream);
    const auto re = g_stream.str();
 
    ::std::cout.rdbuf(g_old);
    g_stream.clear();
    g_stream.str("");
    assert(::std::cout);
    assert(g_stream);
    return re;
}
 
int main()
{
    beg_redirect(); // <--- перенаправляем std::cout в наш stringstream
 
    //<--- здесь поток данных уже перенаправлен
    //<--- и тепреь данные уходят не в консоль
    // а в наш stringstream
    // поэтому мы уже не увидим этот тексто в консоли
 
    std::cout << "hello ";
    std::cout << "world!";
    
    const std::string capture = end_redirect(); // <--- восстанавливаем прежние настройки
    
    // --- здесь std::cout снова работает как обычно
    // --- и мы увидим текст в консоли
 
    std::cout << "redirected: " << capture << '\n';
}
std::cout - это один конец трубы.
через который ты закидываешь данные.

другой конец трубы обычно ведет в консоль
(устройство, которое отвечает за печать текста в черно-белом окошке)

я же перенаправил другой конец трубы так,
что бы получателем данных оказался объект std::stringstream g_stream
1
3 / 3 / 0
Регистрация: 28.11.2018
Сообщений: 242
02.11.2020, 15:38  [ТС] 8
hoggy, огромное спасибо за развернутый ответ))
Всё понял, но хочу уточнить последнюю деталь: является ли "потоком" присвоение данных той де переменной?
Н-р: int a = 5;

Добавлено через 2 минуты
По факту то это тоже определенный поток данных... Только направлен он от константы к переменной
0
02.11.2020, 15:38
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.11.2020, 15:38
Помогаю со студенческими работами здесь

Перевести int в string с помощью sstream
От пример кода. Я пробую несколько раз перевести int в string с помощью sstream. Но у меня почемуто...

Оптимизация кода, структуры базы, или что еще можно сделать что бы быстрее работало!?
Всем привет! Господа, выручайте. Не пойму как еще оптимизировать... Есть куча связанных таблиц....

Что работает быстрее?
Здравствуйте! Друзья, что лучше (правильнее) использовать: for(int i=0; i&lt;strlen(ABC); ++i) {}...

Что работает быстрее?
Делаю игру. Координаты объектов (кубов) должны сохраняться в файл и изменяться во время игры. ...

Что работает быстрее?
Подскажите пожалуйста, какая из данных реализаций будет работать бытрее? int a = 5; int b =...

Что быстрее 7 или XP?
Есть нетбук Acer Aspire One D257 с параметрами: Производитель:...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru