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

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

08.07.2016, 00:16. Показов 4131. Ответов 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
Ответ Создать тему
Новые блоги и статьи
сукцессия 31: модель микоризы - это модель ещё нескольких явлений, социальных и экономических
anaschu 18.07.2026
Теория «Всего»: апдейт v1. 1. 2 — 28‑мерное ядро стабилизировано Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не. . .
сукцессия 30. Массив проверяющих друг друга моделей
anaschu 18.07.2026
Архитектура сети взаимопроверяющих моделей микоризной сукцессии (v2. 0) Развитие тензорного ОДУ-ядра и создание кросс-платформенного калибровочного полигона Уважаемые коллеги! В продолжение. . .
Грибы - это женщины, деревья - это мужчины. Анти инь янь для союза мужчины и женщины.
anaschu 18.07.2026
ГЛАВНЫЙ НАУЧНО-ФИЛОСОФСКИЙ ВЫВОД: Сексуально-Репродуктивный Капитализм против Государства Моногамии Коллеги, мы вышли на финишную прямую 20-мерного ОДУ-моделирования вековой сукцессии (ветка. . .
Текстовый слайдер с нумерацией страниц и кроссбраузерность.
russiannick 18.07.2026
Один мой друг написал текстовый слайдер с нумерацией страниц. Сегодня я расскажу как он умудрился подружить его с кроссбраузерностью. Очевидно сложно угодить с шириной каждому браузеру. Один крадет. . .
Грибы - это мемы, дерево - это человек. Применение микоризной модели к теории меметики Докинза.
anaschu 18.07.2026
Меметический изоморфизм теории «всего»: Грибная сукцессия как модель эволюции идей Докинза Базовый код системы ОДУ микоризной сукцессии описывает не просто биологию, а универсальную. . .
Грибы - это корпорации, деревья - это государства. Механизм массонского захвата власти
anaschu 18.07.2026
Макроэкономический изоморфизм теории «всего»: Грибная сукцессия как модель транснационального капитализма Базовый код системы ОДУ микоризной сукцессии описывает не просто биологию, а. . .
Расчёт периметра прямоугольника по координатам вершин
Maks 18.07.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Вычислить периметр прямоугольника, заданного координатами своих вершин на плоскости. Решение: Создан документ со следующими. . .
Подсчёт частоты трёхбуквенных слов в тексте
Maks 18.07.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Выясните, сколько раз в предложенном тексте встречается каждое трехбуквенное слово. Решение: Создан документ с единственным. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru