Аватар для meJevin
161 / 153 / 92
Регистрация: 18.11.2015
Сообщений: 677

Немного про std::string

08.07.2016, 00:16. Показов 3274. Ответов 34
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет, читал про std::string на разных сайтах.


1. Там говорят, С++ 11 гарантирует, что std::string будет stored contiguously in memory. В этом я не сомневаюсь, но каким еще образом можно в памяти хранить std::string?

2. Говорят, что std::string на самом деле имеет null-terminator на конце. Это так? Вроде да, я в этом немного убедился в своей студии. Сделал четыре std::string'a, через цикл от 0 до size()+1 вывел все представления их символов в виде int, и да, последний символ был '\0' (в int виде просто 0).

Но все равно, некоторые говорят, что если мы имеем std::string str("hello"); и пытаемся получить доступ к желанному null-terminator'у, у нас может быть UB. Т.е. писать такое: std::cout << (int)str[str.size()] << std::endl; не стоит. Правда может быть UB?

3. Что под капотом у std::string на самом деле? Можете объяснить простым языком, если не трудно?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.07.2016, 00:16
Ответы с готовыми решениями:

Не могу разобраться как обновить в std::map<std::string, вектор_структур>
Не могу разобраться как обновить вектор структур после его добавления в map без удаления и перезаписи struct pStruct { int...

std::string, std::fstream, ошибка кучи
где то начало вылетать при операции += с локальной переменной std::string. Заменил на свой qString. Замечательно, то же самое... ошибка при...

Файловый поток и std::string
добрый день сейчас меня немножко ввело в тупняк - из файлового потока(ifstream) нельзя прочитать по словам типа std::string? только char*...

34
4820 / 2286 / 287
Регистрация: 01.03.2013
Сообщений: 5,970
Записей в блоге: 30
08.07.2016, 00:26
Цитата Сообщение от meJevin Посмотреть сообщение
каким еще образом можно в памяти хранить
да любым - например, в виде односвязного списка чаров.

ЗЫ1: если абстракция предоставляет внешний апи - не стоит лезть и курочить ее нутрь. Потому что завтра новый Степанов перепишет эти стринги по-другому с сохранением апи, и ваша программа, рассчитывающая на нуль-терминатор, может свалиться. Например, паскалевские строки - хранят размер в первом байте. И можно на это рассчитывать. Но тогда длина не более 255, кому-то это однажды надоело, и он стал хранить длину в первом слове - двух байтах. И кто пользовался апи - не заметили, а кто рассчитывал на реализацию - приплыли.

ЗЫ2: расположение строк строго в линейной области памяти - это хорошо. В Си. А в Яве с Шарпом решили гениально совместить это требование (само по себе необязательное - см. п 1) с иммутабельностью строк И начались ужасы от тех, кто не особо понимал, как это готовить без всяких стрингбилдеров, ибо при для иммутабельности строки при операциях (конкатенация/выделение подстроки и т.п.) копируются в новые области памяти, которые аллоцируются, и если в цикле - то долго и медленно... И из-за этой имхо странной реализации многие не желающие думать императивные программисты делают вывод о том, что иммутабельные структуры данных в функциональных языках всегда копируются и жрут память и время....
0
 Аватар для meJevin
161 / 153 / 92
Регистрация: 18.11.2015
Сообщений: 677
08.07.2016, 00:45  [ТС]
Цитата Сообщение от _Ivana Посмотреть сообщение
да любым - например, в виде односвязного списка чаров.
Это понятно, но ведь по перформансу-то долбанет же? Поэтому лучше всего contiguously in memory, так?
0
 Аватар для HenryDukart
125 / 125 / 44
Регистрация: 05.10.2013
Сообщений: 462
08.07.2016, 00:48
meJevin, требования ко всем контейнерам предъявляются не на их реализацию, а на производительность. Реализовать можете как угодно, лишь бы удовлетворяло условиям сложности.
0
4820 / 2286 / 287
Регистрация: 01.03.2013
Сообщений: 5,970
Записей в блоге: 30
08.07.2016, 00:50
Цитата Сообщение от meJevin Посмотреть сообщение
так?
Ну вы же не вчера структуры данных узнали. Долбанет по доступу за О(1) к любому элементу, зато позволит быстро расширять с головы, в отличие от стандартных массивов. В хаскеле, например, 2 типа строк - высокоуровневые - списки чаров, низкоуровневые - байтстринги. Тот же Джоэл Спольски, когэа в Майкрософте Эксель на Сях костылил, влепил туда паскалевские строки - "поэтому Эксель такой быстрый" (С). Короче - в зависит от области применения.
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
08.07.2016, 02:24
Цитата Сообщение от _Ivana Посмотреть сообщение
да любым - например, в виде односвязного списка чаров.
Неправда ваша. В стандарте четко написано:
A basic_string is a contiguous container
Т.е. под капотом у него может быть только си-строка. (Почему не просто массив чаров без терминального нуля - тоже написано, но в требованиях к operator[], c_str() и data(), которая в c++17, кстати, станет неконстантной).
0
4820 / 2286 / 287
Регистрация: 01.03.2013
Сообщений: 5,970
Записей в блоге: 30
08.07.2016, 02:38
Цитата Сообщение от avgoor Посмотреть сообщение
В стандарте четко написано
Да шел бы он, стандарт (простите за непопулярное имхо) ТС спрашивал каким еще образом можно - я ответил.
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
08.07.2016, 02:39
Цитата Сообщение от _Ivana Посмотреть сообщение
ТС спрашивал каким еще образом можно - я ответил
Но, господин! Если:
Цитата Сообщение от _Ivana Посмотреть сообщение
Да шел бы он, стандарт
то это будет не std::string из C++.
0
4820 / 2286 / 287
Регистрация: 01.03.2013
Сообщений: 5,970
Записей в блоге: 30
08.07.2016, 02:42
Резонно На это мы или свой буст не стд-шный навелосипедим, или стандарт поменяем (вроде какая-то российская компания стала официальным членом комитета что-ли, и может принимать предложения от соотечественников). Или и то и другое одновременно
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
08.07.2016, 02:48
Цитата Сообщение от _Ivana Посмотреть сообщение
Или и то и другое одновременно
Даже если и так, std::string всегда будет содержать способ каста к си-строке "для совместимости"™. Теоретически можно сделать стринг на списках, с мутабельным массивом, и только кэшировать туда данные. Но, так может сделать только "мудакъ"®. А реализацию STL "мудаки"® не пишут.
1
4820 / 2286 / 287
Регистрация: 01.03.2013
Сообщений: 5,970
Записей в блоге: 30
08.07.2016, 03:00
Цитата Сообщение от avgoor Посмотреть сообщение
всегда будет содержать способ каста к си-строке "для совместимости"™
И что? Уж каст то для совместимости можно сделать из чего угодно.
Цитата Сообщение от avgoor Посмотреть сообщение
Но, так может сделать только "мудакъ"®. А реализацию STL "мудаки"® не пишут.
Я не знаком с авторами стл, чтобы иметь о них какое-либо мнение. Зато хорошо знаком с одним парнем, который выкинул нахрен все стл-ство (на которое молились предыдущие разрабы) из пендосского проекта, написал свои реализации и убыстрил его в несколько раз.
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
08.07.2016, 03:06
Цитата Сообщение от _Ivana Посмотреть сообщение
написал свои реализации и убыстрил его в несколько раз
Та же фигня. Но это - фундаментальное свойство любой техники: Любое специальное устройство всегда оптимальнее общего.
Цитата Сообщение от _Ivana Посмотреть сообщение
Уж каст то для совместимости можно сделать из чего угодно.
Вопрос цены (в смысле затрат памяти итд).
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
08.07.2016, 04:20
Цитата Сообщение от HenryDukart Посмотреть сообщение
meJevin, требования ко всем контейнерам предъявляются не на их реализацию, а на производительность. Реализовать можете как угодно, лишь бы удовлетворяло условиям сложности.
Да ладно! Так-то по стандарту контейнер, например, есть массив, т.е. занимает непрерывный кусок памяти.
0
 Аватар для HenryDukart
125 / 125 / 44
Регистрация: 05.10.2013
Сообщений: 462
08.07.2016, 11:25
Mr.X, разве где-то описывается внутреннее устройство контейнера?
1
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
08.07.2016, 14:47
Цитата Сообщение от HenryDukart Посмотреть сообщение
разве где-то описывается внутреннее устройство контейнера?
Адын:
21.3.1 Class template basic_string
3 A basic_string is a contiguous container
Два:
23.2.1 General container requirements
13 A contiguous container is a container that supports random access iterators and whose member types iterator and const_iterator are contiguous iterators
Три:
24.2 Iterator requirements
24.2.1 In general
5 Iterators that further satisfy the requirement that, for integral values n and dereferenceable iterator values a and (a + n), *(a + n) is equivalent to *(addressof(*a) + n), are called contiguous iterators.
0
 Аватар для HenryDukart
125 / 125 / 44
Регистрация: 05.10.2013
Сообщений: 462
08.07.2016, 15:14
avgoor, про внутреннюю реализацию ни слова.

Добавлено через 19 минут
avgoor, ну ни слова это я загул конечно. Спасибо за такое точное определение.

Специально наперекор использование структуры массива могу предложить использование структуры список, где элементы размещаются последовательно в выделенном участке памяти (с помощью new с размещением). Конечно, никакой рациональностью тут и не пахнет, но все же.
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
08.07.2016, 15:41
Цитата Сообщение от HenryDukart Посмотреть сообщение
Mr.X, разве где-то описывается внутреннее устройство контейнера?
Ой, пардон, я вектор имел в виду.
Для него в стандарте есть требование, чтобы он в памяти был подобен массиву.
0
 Аватар для HenryDukart
125 / 125 / 44
Регистрация: 05.10.2013
Сообщений: 462
08.07.2016, 15:54
Mr.X, вы, наверное, про метод data().
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
08.07.2016, 15:58
Цитата Сообщение от HenryDukart Посмотреть сообщение
Специально наперекор использование структуры массива могу предложить использование структуры список, где элементы размещаются последовательно в выделенном участке памяти (с помощью new с размещением)
А указатели где хранить? В другом месте будет массив {1, 2, 3, 4, 5, ...}? Зачем? И самое главное, если список всегда располагается в памяти по последовательным адресам - такой список называется массивом.
В прочем выше я уже писал: "теоретически, можно...".
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
08.07.2016, 16:25
Цитата Сообщение от HenryDukart Посмотреть сообщение
Mr.X, вы, наверное, про метод data().
Я про то, что элементы вектора по стандарту хранятся в массиве, а адрес первого элемента вектора указывает на начало этого массива.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.07.2016, 16:25
Помогаю со студенческими работами здесь

Перевод строк std::string, std::wstring в Unicode (String)
Собственно столкнулся с проблемой, как корректно перевести к примеру текст из Edit1-&gt;Text в std::string или std::wstring и...

Заменить std::string на (String, UnicodeString, wchar_t)
Ребята подсобите std::string заменить на (String, UnicodeString, wchar_t) static size_t write_data(char *ptr, size_t size, size_t...

Перевод из Unicodestring B std::string
Как осуществить перевод из Unicodestring B std::string? String(..).c_str t_str не работает.

String -> std::string
String b = Edit2-&gt;Text; std::string str = AnsiString(b.c_str()); Unit1.cpp(41): E2285 Could not find a match for...

Std::string в UnicodeString RAD XE4
Доброго времени суток. Как переменной UnicodeString присвоить значение из переменной std::string? пробовал так: std::string...


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

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

Новые блоги и статьи
50 самых полезных примеров кода Python для частых задач
py-thonny 18.06.2025
Эффективность работы разработчика часто измеряется не количеством написаных строк, а скоростью решения задач. Готовые сниппеты значительно ускоряют разработку, помогают избежать типичных ошибок и. . .
C# и продвинутые приемы работы с БД
stackOverflow 18.06.2025
Каждый . NET разработчик рано или поздно сталкивается с ситуацией, когда привычные методы работы с базами данных превращаются в источник бессонных ночей. Я сам неоднократно попадал в такие ситуации,. . .
Angular: Вопросы и ответы на собеседовании
Reangularity 16.06.2025
Готовишься к техническому интервью по Angular? Я собрал самые распространенные вопросы, с которыми сталкиваются разработчики на собеседованиях в этом году. От базовых концепций до продвинутых. . .
Архитектура Onion в ASP.NET Core MVC
stackOverflow 16.06.2025
Что такое эта "луковая" архитектура? Термин предложил Джеффри Палермо (Jeffrey Palermo) в 2008 году, и с тех пор подход только набирал обороты. Суть проста - представьте себе лук с его. . .
Unity 4D
GameUnited 13.06.2025
Четырехмерное пространство. . . Звучит как что-то из научной фантастики, правда? Однако для меня, как разработчика со стажем в игровой индустрии, четвертое измерение давно перестало быть абстракцией из. . .
SSE (Server-Sent Events) в ASP.NET Core и .NET 10
UnmanagedCoder 13.06.2025
Кажется, Microsoft снова подкинула нам интересную фичу в новой версии фреймворка. Работая с превью . NET 10, я наткнулся на нативную поддержку Server-Sent Events (SSE) в ASP. NET Core Minimal APIs. Эта. . .
С днём независимости России!
Hrethgir 13.06.2025
Решил побеседовать, с утра праздничного дня, с LM о завоеваниях. То что она написала о народе, представителем которого я являюсь сам сначала возмутило меня, но дальше только смешило. Это чисто. . .
Лето вокруг.
kumehtar 13.06.2025
Лето вокруг. Наполненное бурями и ураганами событий. На фоне магии Жизни, священной и вечной, неумелой рукой человека рисуется панорама душевного непокоя. Странные серые краски проникают и. . .
Популярные LM модели ориентированы на увеличение затрат ресурсов пользователями сгенерированного кода (грязь -заслуги чистоплюев).
Hrethgir 13.06.2025
Вообще обратил внимание, что они генерируют код (впрочем так-же ориентированы разработчики чипов даже), чтобы пользователь их использующий уходил в тот или иной убыток. Это достаточно опытные модели,. . .
Топ10 библиотек C для квантовых вычислений
bytestream 13.06.2025
Квантовые вычисления - это та область, где теория встречается с практикой на границе наших знаний о физике. Пока большая часть шума вокруг квантовых компьютеров крутится вокруг языков высокого уровня. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru