Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.69
Union
17 / 17 / 2
Регистрация: 16.08.2010
Сообщений: 252
#1

Вопрос по вектору string'ов - C++

24.04.2011, 21:49. Просмотров 1853. Ответов 28
Метки нет (Все метки)

Не совсем представляю как работает вектор стрингов
C++
1
std::vector<std::string> texts;
Вектор по стандарту располагается в едином куске памяти. Если я использую вектор чаров (массивов), они фиксированного размера. Это значит что при выделении памяти методом reserve я четко выделяю себе нужный кусок памяти, при изменении элемента в середине, сдвига всего, что идет после - не происходит. А вот со стрингом не понятно. При выделении памяти вродебы размер элемента составляет 1 байт... Получается количество элементов, которое поместится в выделенную память предсказать нельзя.
Если я меняю содержимое стринга, находящегося в середине вектора, всё, что идёт после - смещается, если размер нового стринга не равен размеру старого. Я прав?
Или вектор стрингов - это вектор указателей, а информация хранится вне его?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.04.2011, 21:49
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Вопрос по вектору string'ов (C++):

Альтернатива вектору - C++
Добрый день. Такая проблема. имеется модуль сопряжения, который соединяет ддлки от 2005 и 2010 студии. там есть некий класс, который...

Поиск, Сортировка по Вектору в с++ - C++
Не могу разобраться как обратится к элементу класса например name. в векторе groupArray. Из за этого не могу реализовать поиск по имени,...

Поиск строки по вектору - C++
Добрый день. Помогите разобраться с проблемой пожалуйста: я перегоняю данные из бинарного файла в вектор (так нужно по заданию), затем мне...

Поиск по вектору не работает - C++
Есть класс и контейнер-вектор, надо отсортировать контейнер вектор,выполнить поиск #include &lt;iostream&gt; #include &lt;vector&gt; #include...

Как обращаться к вектору из структуры - C++
Я записала в вектор структуру: struct Sotrudnic { char surname, name, patronymic, propiska, pol, status; int passport, age,...

Можно ли применить find_if к вектору - C++
Можно ли применить find_if к вектору? Нужно найти среди компонент вектора первое число, которое больше задаваемой величины (в векторе...

28
silent_1991
25.04.2011, 01:15     Вопрос по вектору string'ов
  #16

Не по теме:

ForEveR, не, ну это не честно))) Тут в первом случае тоже 73 надо бы прибавить, для полноты картины)))

0
fasked
Эксперт С++
4972 / 2552 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
25.04.2011, 01:17 #17
Может быть еще будет важно в какой области памяти лежат строки, в случае динамического выделения это будет куча, а в случае статического стек. При таких объемах данных, наверное, это будет важно
0
kravam
быдлокодер
1705 / 892 / 45
Регистрация: 04.06.2008
Сообщений: 5,524
25.04.2011, 01:42 #18
ForEveR, не пойдёт. Щас я бы поговорил не о размерах переменных, а о том, сколько памяти выделяется и в том и в другом случае. Как я уже сказал, в случае со string я могу только предполагать, но иногда- иногда- знаю наверняка. Так вот,

C++
1
2
std::string some_str = 
        "klklkjkjkjnmxncmznjdfhjnczc,zxjmzj,fkkzlxmcx,czjfkjcm,zxcxnkalkjkasjda;l";
Так вот, в данном случае

C++
1
"klklkjkjkjnmxncmznjdfhjnczc,zxjmzj,fkkzlxmcx,czjfkjcm,zxcxnkalkjkasjda;l";
есть. И соответствено занимает память. А то, что мы не увидели объёма занимаемой ей памяти, так это вот и есть как бы вот так вот ну вот.

Далее, о чём я.
C++
1
string str;
Вот после этого объявления создаются коды всякие функций и пускай они типа ни при делах а вообще, и мы вроде как их только имеем ввиду, но код той же функции str.size() в оперативной памяти место занимает, как ни крути. И коды других функций методов тоже. И это всё влияет на размер файла соответственно. К сожалению не знаю как получать указатели на эти функции, а то бы специально поставил бы бряки на эти адреса и посмотрел отладчике память, занимаемую этими функциями.
Вот что я имел ввиду, говоря о расходе памяти в случае со string.

А указатель на char 4 байта ни больше ни меньше.

Добавлено через 54 секунды
silent_1991, в смысле, а как не вручную-то? Чё-то я не понимаю
0
silent_1991
Эксперт С++
5005 / 3063 / 149
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
25.04.2011, 01:49 #19
kravam, вручную - это
C++
1
2
char *str2 = new char [strlen(str1) + 1];
strcpy(str2, str1);
вместо
C++
1
std::string str2 = str1;
Ну как пример.

Цитата Сообщение от kravam Посмотреть сообщение
Вот после этого объявления создаются коды всякие функций
Ничего подобного, в код будут включены только те функции, которые хотя бы однажды вызываются.
0
fasked
Эксперт С++
4972 / 2552 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
25.04.2011, 01:49 #20
Цитата Сообщение от kravam Посмотреть сообщение
Вот после этого объявления создаются коды всякие функций и пускай они типа ни при делах а вообще, и мы вроде как их только имеем ввиду, но код той же функции str.size() в оперативной памяти место занимает, как ни крути. И коды других функций методов тоже. И это всё влияет на размер файла соответственно.
Не намного больше, чем любая сишная функция, например strlen. Классы конечно будут съедать чуть больше, но это настолько незначительно. Ну и на оперативную память это действительно мало влияет.
0
alex_x_x
бжни
2454 / 1659 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
25.04.2011, 01:51 #21
Цитата Сообщение от kravam Посмотреть сообщение
, но код той же функции str.size() в оперативной памяти место занимает, как ни крути.
strlen тоже отъест место от бинарника
Цитата Сообщение от kravam Посмотреть сообщение
И коды других функций методов тоже.
тут уже говорилось, что при загрузке программы в озу код функций-членов будет встречатся единожды, речь о грошах идет
Цитата Сообщение от kravam Посмотреть сообщение
Вот что я имел ввиду, говоря о расходе памяти в случае со string.
это странно

Цитата Сообщение от kravam Посмотреть сообщение
А указатель на char 4 байта ни больше ни меньше.
да нет же
0
silent_1991
25.04.2011, 01:53
  #22

Не по теме:

alex_x_x, хм... я тоже думал, что в 32-хбитных системах указатель занимает 4 байта...

0
fasked
Эксперт С++
4972 / 2552 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
25.04.2011, 01:53 #23
Указатель зависит от целевой архитектуры. Капитан намекает, что он может быть и 8 байт и сколько либо еще.
1
kravam
быдлокодер
1705 / 892 / 45
Регистрация: 04.06.2008
Сообщений: 5,524
25.04.2011, 12:20 #24
ОК,а тогда, а тогда чё за херь вылезает у меня в dev c++ типа подсказки, когда я пишу так:
C++
1
2
[FONT=monospace]string.
 [/FONT]
Вот после того,как я ставлю точку вылезает подсказка из пяти строчек

Я так понимаю, эти все переменные класса sring и они есть. И они занимают память
0
Миниатюры
Вопрос по вектору string'ов  
silent_1991
Эксперт С++
5005 / 3063 / 149
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
25.04.2011, 15:54 #25
А что, кто-то спорил, что поля класса память не занимают?
0
Union
17 / 17 / 2
Регистрация: 16.08.2010
Сообщений: 252
25.04.2011, 16:02  [ТС] #26
Вы явно ушли от темы. Я спрашивал применительно к вектору.
Нужные мне ответы я получил.
0
silent_1991
25.04.2011, 16:04
  #27

Не по теме:

Union, с чем вас и поздравляю.

1
kravam
быдлокодер
1705 / 892 / 45
Регистрация: 04.06.2008
Сообщений: 5,524
25.04.2011, 16:10 #28
Цитата Сообщение от silent_1991 Посмотреть сообщение
А что, кто-то спорил, что поля класса память не занимают?
ну вот ещё расходы на память. Я это всё автору, пусть знает правду.
0
ForEveR
В астрале
Эксперт С++
7992 / 4751 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
25.04.2011, 16:21 #29
kravam, Не столь огромные расходы при сейчашних компах.
0
25.04.2011, 16:21
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.04.2011, 16:21
Привет! Вот еще темы с ответами:

Обращение к вектору полученному через указатель - C++
Всем привет, Появился вопрос по поводу обращения к вектору полученному через указатель. Выглядит так: Передаю адрес вектора в...

Поиск по вектору наименьшего отсутствующего элемента - C++
В общем, есть вектор, в нем хранятся значения типа &lt;unsigned int&gt;. Как за наименьшее количество проходов по вектору найти наименьший...

Задать размерность вектору генератором случайных чисел - C++
Привет) Ситуация следующая: Динамический вектор. Написать программу по формированию динамического вектора целого типа. Имя вектора...

Проверка индексов при доступе к вектору через [] - C++
При написании кода сталкиваюсь с дилеммой: использовать at или operator при работе с std::vector или подобными вещами. Для релиза то явно...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru