Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.73/15: Рейтинг темы: голосов - 15, средняя оценка - 4.73
 Аватар для meJevin
161 / 153 / 92
Регистрация: 18.11.2015
Сообщений: 677

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

08.07.2016, 00:16. Показов 4380. Ответов 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
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
26.07.2016, 23:31
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от meJevin Посмотреть сообщение
Привет, читал про std::string на разных сайтах.
Не могу сказать как в стандарте, но ведет себя он приблизительно так же как std::vector<char> (но реальный размер +1 под "\0").

Добавлено через 2 минуты
Цитата Сообщение от avgoor Посмотреть сообщение
А указатели где хранить? В другом месте будет массив {1, 2, 3, 4, 5, ...}? Зачем? И самое главное, если список всегда располагается в памяти по последовательным адресам - такой список называется массивом.
В прочем выше я уже писал: "теоретически, можно...".
При списке возникнет проблема с реализацией c_str()
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
26.07.2016, 23:55
Цитата Сообщение от meJevin Посмотреть сообщение
но каким еще образом можно в памяти хранить std::string?
никаким.
Цитата Сообщение от meJevin Посмотреть сообщение
Это так?
это не гарантируется.

Цитата Сообщение от meJevin Посмотреть сообщение
Правда может быть UB?
да

Цитата Сообщение от _Ivana Посмотреть сообщение
да любым - например, в виде односвязного списка чаров.
вы ошибаетесь.

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

21.4.1 basic_string general requirements
5 The char-like objects in a basic_string object shall be stored contiguously. That is, for any basic_string
object s, the identity &*(s.begin() + n) == &*s.begin() + n shall hold for all values of n such that 0
<= n < s.size().
Добавлено через 1 минуту
Цитата Сообщение от avgoor Посмотреть сообщение
Т.е. под капотом у него может быть только си-строка
нет, потому что не обязана быть нуль-терминированной.
1
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
26.07.2016, 23:58
Цитата Сообщение от hoggy Посмотреть сообщение
нет, потому что не обязана быть нуль-терминированной
Обязана. Читайте требования к operator[]
Цитата Сообщение от Avazart Посмотреть сообщение
При списке возникнет проблема с реализацией c_str()
Я писал ровно то же самое.
Немного про std::string
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
26.07.2016, 23:58
Цитата Сообщение от hoggy Посмотреть сообщение
стандарт явно требует
Цитата Сообщение от _Ivana Посмотреть сообщение
Да шел бы он, стандарт (простите за непопулярное имхо)
И вроде уже выяснили, что если говорить про std::string из С++ - тогда да, только как велит стандарт. А если про "как вообще можно" - то как угодно.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
26.07.2016, 23:59
Цитата Сообщение от HenryDukart Посмотреть сообщение
структуры список, где элементы размещаются последовательно
элементами списка являются ноды - объекты, которые держат указатель на след. ноду.
по стандарту там должны быть буковки.

поэтому лист не подойдет внезависимости от аллокатора.
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
27.07.2016, 00:02
Цитата Сообщение от _Ivana Посмотреть сообщение
А если про "как вообще можно" - то как угодно.
В С++ много чего можно... но говорить про "все" - лишено смысла.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
27.07.2016, 00:04
Цитата Сообщение от _Ivana Посмотреть сообщение
И вроде уже выяснили, что если говорить про std::string из С++ - тогда да, только как велит стандарт. А если про "как вообще можно" - то как угодно.
ТС спрашивал об std::string.

"как вообще" - оффтопик, который не представляет интереса в рамках данной темы.
Цитата Сообщение от avgoor Посмотреть сообщение
Обязана. Читайте требования к operator[]

вот здесь:
21.4.5 basic_string element access [string.access]
const_reference operator[](size_type pos) const;
reference operator[](size_type pos);
1 Requires: pos <= size().
2 Returns: *(begin() + pos) if pos < size(). Otherwise, returns a reference to an object of type
charT with value charT(), where modifying the object leads to undefined behavior.
3 Throws: Nothing.
4 Complexity: constant time.
я так понял собака зарыта:
1 Requires: pos <= size().

то бишь правомерно обращаться к элементу за последней буковкой.
то бишь к нулю?
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
27.07.2016, 00:04
Avazart, у многих и вся жизнь лишена смысла, так что обсуждать смысл - занятие неблагодарное. Я вот так широко понял (и продолжаю понимать) вопрос ТС, оппоненты тычут в нос стандартом и говорят "нельзя"...
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
27.07.2016, 00:09
Цитата Сообщение от hoggy Посмотреть сообщение
то бишь правомерно обращаться к элементу за последней буковкой
Да, правомерно читать нуль-терминатор с помощью [] (который должен выдавать непрерывную память - т.е. нуль терминатор хранится всегда). Писать что-то в нуль терминатор - UB.
2
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
27.07.2016, 00:11
Цитата Сообщение от hoggy Посмотреть сообщение
то бишь правомерно обращаться к элементу за последней буковкой.
то бишь к нулю?
Получается что так, только возникает вопрос что, если
C++
1
str[str.size()] = 'a';
1
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
27.07.2016, 00:12
Цитата Сообщение от Avazart Посмотреть сообщение
Получается что так, только возникает вопрос что, если
UB.
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
27.07.2016, 00:14
Цитата Сообщение от avgoor Посмотреть сообщение
UB.
Можно предположить что до первого .c_str() или .data() все может быть нормально...
или нет перефразирую что все будет нормально до передачи в ф-цию вычисляющую длину по \0.

Ибо сам std::string как я понимаю опирается не на \0 а на внутреннюю переменную m_size.
Ибо такие вещи как
C++
1
std::string str= "line1\0line2\0line3";
имеют места быть.
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
27.07.2016, 00:16
Цитата Сообщение от Avazart Посмотреть сообщение
Можно предположить что до первого .c_str() или .data() все может быть нормально... или нет что все будет нормально до передачи в ф-цию вычисляющую длину по \0
На то оно и UB, что предполагать как оно будет - неблагодарное дело.
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
27.07.2016, 00:42
Кстати спонтанно возник такой код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
// Example program
#include <iostream>
#include <string>
 
struct UserType
{
};
 
int main()
{
  std::basic_string<UserType> x;
  x[x.size()];  // ??
}
Что является нулем в конце, если тип пользовательский?

По идее за это должен отвечать std::char_traits<>
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
27.07.2016, 01:32
Цитата Сообщение от Avazart Посмотреть сообщение
Что является нулем в конце, если тип пользовательский?
C++
1
2
const auto null_terminator 
    = typename std::basic_string<T>::value_type();
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.07.2016, 01:32

Перевод строк 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...


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

Или воспользуйтесь поиском по форуму:
35
Ответ Создать тему
Новые блоги и статьи
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
Красочные поля с номером страницы svg+background-image
russiannick 04.11.2026
Красочные поля с номером страницы не менее важны чем в эпоху бумажных книг. Посему спешу представить почтеннейшей публике этот важный инструмент который эти поля и формирует. В процессе разработки. . .
Вступаем в новую фазу генерации favicons, векторную.
russiannick 02.11.2026
Теперь нет нужды скрывать что используется простой svg. Исходный код изображения помещаем в поле и жмем кнопку. Исходник преобразуется в вид корректный для помещения в favicon или в url(). Нажатие. . .
Генератор паролей (вариант №4)
Maks 01.11.2026
После публикации 3-го варианта генератора паролей, разослал его своим коллегам (с целью оценки), в итоге были получены следующие рекомендации: 1. Вернуть возможность использования знаков | 1 l I;. . .
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С. Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию? Фраза «Любая достаточно развитая технология неотличима от магии». . .
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль? Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология. «Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru