161 / 153 / 92
Регистрация: 18.11.2015
Сообщений: 677
|
|
1 | |
Немного про std::string08.07.2016, 00:16. Показов 2695. Ответов 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
|
08.07.2016, 00:16 | |
Ответы с готовыми решениями:
34
Не могу разобраться как обновить в std::map<std::string, вектор_структур> std::string, std::fstream, ошибка кучи Файловый поток и std::string Перевод строк std::string, std::wstring в Unicode (String) |
26.07.2016, 23:31 | 21 |
Не могу сказать как в стандарте, но ведет себя он приблизительно так же как std::vector<char> (но реальный размер +1 под "\0").
Добавлено через 2 минуты При списке возникнет проблема с реализацией c_str()
0
|
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|
26.07.2016, 23:55 | 22 |
никаким.
это не гарантируется. да вы ошибаетесь. стандарт явно требует располагать буковки в непрерывном блоке памяти. нет, потому что не обязана быть нуль-терминированной.
1
|
1550 / 875 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
|
|
26.07.2016, 23:58 | 23 |
0
|
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|
26.07.2016, 23:59 | 25 |
элементами списка являются ноды - объекты, которые держат указатель на след. ноду.
по стандарту там должны быть буковки. поэтому лист не подойдет внезависимости от аллокатора.
0
|
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|
27.07.2016, 00:04 | 27 |
ТС спрашивал об std::string.
"как вообще" - оффтопик, который не представляет интереса в рамках данной темы. вот здесь: 1 Requires: pos <= size(). то бишь правомерно обращаться к элементу за последней буковкой. то бишь к нулю?
0
|
27.07.2016, 00:04 | 28 |
Avazart, у многих и вся жизнь лишена смысла, так что обсуждать смысл - занятие неблагодарное. Я вот так широко понял (и продолжаю понимать) вопрос ТС, оппоненты тычут в нос стандартом и говорят "нельзя"...
0
|
1550 / 875 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
|
|
27.07.2016, 00:09 | 29 |
Да, правомерно читать нуль-терминатор с помощью [] (который должен выдавать непрерывную память - т.е. нуль терминатор хранится всегда). Писать что-то в нуль терминатор - UB.
2
|
1550 / 875 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
|
|
27.07.2016, 00:12 | 31 |
0
|
27.07.2016, 00:14 | 32 | |||||
Можно предположить что до первого .c_str() или .data() все может быть нормально...
или нет перефразирую что все будет нормально до передачи в ф-цию вычисляющую длину по \0. Ибо сам std::string как я понимаю опирается не на \0 а на внутреннюю переменную m_size. Ибо такие вещи как
0
|
1550 / 875 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
|
|
27.07.2016, 00:16 | 33 |
0
|
27.07.2016, 00:42 | 34 | |||||
Кстати спонтанно возник такой код:
По идее за это должен отвечать std::char_traits<>
0
|
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||||
27.07.2016, 01:32 | 35 | |||||
0
|
27.07.2016, 01:32 | |
27.07.2016, 01:32 | |
Помогаю со студенческими работами здесь
35
Заменить std::string на (String, UnicodeString, wchar_t) Перевод из Unicodestring B std::string String -> std::string Std::string в UnicodeString RAD XE4 Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |