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

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

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

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

24.04.2011, 21:49. Просмотров 1780. Ответов 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 к вектору? Нужно найти среди компонент вектора первое число, которое больше задаваемой величины (в векторе...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Ma3a
Эксперт C++
617 / 461 / 31
Регистрация: 28.01.2011
Сообщений: 605
24.04.2011, 21:55 #2
Реализации std::string, вообще говоря, бывают разные, но в целом они все действуют по одной схеме: в самом объекте хранится только указатель на строковый буфер, с которым будет вестись работа, так что размеры каждого std::string будут фиксированными в представлении вектора и того, что вы описали, не возникнет.
0
silent_1991
Эксперт С++
4964 / 3040 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
24.04.2011, 21:55 #3
Начинать надо с конца. Как представлен класс std::string? Он содержит в себе указатель на символьный тип. Т.е. сам экземпляр лежит в одном куске памяти, а массив символов - в другом. Поэтому экземпляр имеет фиксированный размер (который не включает в себя размер символьного массива). Вектор (кстати, точно не уверен, но по-моему в стандарте ничего о непрерывности участка памяти не сказано, однако не о том сейчас) строк будет хранить в себе экземпляры строкового класса фиксированного одинакового размера, в каждом из которых располагается указатель на массив символов, который может лежать где угодно в памяти.
0
Ma3a
24.04.2011, 22:04
  #4

Не по теме:

silent_1991, в C++98 по поводу вектора действительно ничего не сказано, но в C++03 и C++0x этот момент явно оговорен

1
Union
17 / 17 / 2
Регистрация: 16.08.2010
Сообщений: 252
24.04.2011, 22:06  [ТС] #5
Понятно, значит всётаки указатель...
Получается если я использую стринг, то
- экономится место в памяти
- при каждом добавлении/замене элемента происходит выделение/освобождение памяти
При использовании массива чаров
- место не экономится... в среднем в моей задаче я тогда теряю ~20% памяти
- при резервировании выделекния/освобождения памяти не происходит
Вопросы
1. Если я заменяю в векторе один стринг на другой, тогоже размера - только в этом случае освобождения и выделения памяти не происходит? Или происходит во всех случаях?
2. Что на ваш взгляд будет быстрее, вектор стрингов 1гб или вектор чаров 1,3 гб, если по вектору производится только операция поиска и он несортированный?
0
silent_1991
24.04.2011, 22:12
  #6

Не по теме:

Ma3a, да, на счёт C++0x знал, а на счёт 03 уверен как раз не был))

0
Union
17 / 17 / 2
Регистрация: 16.08.2010
Сообщений: 252
24.04.2011, 22:19  [ТС] #7
А по теме, на мои вопросы ответите? Хотябы предположение
0
Ma3a
Эксперт C++
617 / 461 / 31
Регистрация: 28.01.2011
Сообщений: 605
24.04.2011, 22:31 #8
Цитата Сообщение от Union Посмотреть сообщение
1. Если я заменяю в векторе один стринг на другой, тогоже размера - только в этом случае освобождения и выделения памяти не происходит? Или происходит во всех случаях?
В принципе никаких выделений и освобождений быть не должно, будет просто копирование из одного буфера в другой, хотя это, опять же, зависит от того, как вы заменяете, то есть если через конструирование безымянных std::string, естественно, будет выделяться и освобождаться память из под этих конструируемых объектов.
1
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
24.04.2011, 22:51 #9
Цитата Сообщение от Union Посмотреть сообщение
1. Если я заменяю в векторе один стринг на другой, тогоже размера - только в этом случае освобождения и выделения памяти не происходит? Или происходит во всех случаях?
зависит от реализации
если string реализован по идиоме конверт-письмо (std::string - конверт, символьный буфер - письмо), то при присвоении одного string другому один из string просто получит указатель на буфер другого (те оба конверта будут использовать одно письмо, с учетом подсчета ссылок итп)
Цитата Сообщение от Union Посмотреть сообщение
2. Что на ваш взгляд будет быстрее, вектор стрингов 1гб или вектор чаров 1,3 гб, если по вектору производится только операция поиска и он несортированный?
я гдето уже это видел, возьмите и померьте
1
kravam
быдлокодер
1695 / 882 / 45
Регистрация: 04.06.2008
Сообщений: 5,460
25.04.2011, 00:41 #10
Цитата Сообщение от Union Посмотреть сообщение
Получается если я использую стринг, то
- экономится место в памяти
Только не это. Вот, допустим,
C++
1
char* p= "cafebabe";
Вот сколько ты видишь памяти занято явно, столько и занято. 13 байт.

C++
1
string str= "cafebabe";
Вот тут сколько занято? Точно не подсчитывал да и не собираюсь, ибо для побайтного контроля есть пример выше С. Но точно не меньше. Ибо, допустим вызовы методов как-то ведь реализуются?
C++
1
string.size();
Ну то есть должна быть где-то определена функция size, а непосредвственно в каждом объекте типа string указатель на эту функцию, а таких функций много.

Ну то есть за удобство платим памятью и скоростью
0
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,542
Завершенные тесты: 3
25.04.2011, 00:42 #11
kravam, Размер string-a это указатель на char + две переменных типа size_t.
Хотя зависит от реализации.
Хотя у меня пустой объект string - у меня 32 байта весит)
0
silent_1991
Эксперт С++
4964 / 3040 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
25.04.2011, 00:46 #12
kravam, никаких указателей на функции в объекте не сидит, при вызове в функцию неявно передаётся указатель на объект, который её вызвал, и внутри функции имеет имя this.
0
kravam
быдлокодер
1695 / 882 / 45
Регистрация: 04.06.2008
Сообщений: 5,460
25.04.2011, 01:09 #13
Ну я это и имел ввиду. Главное, что памяти там нормально расходуется. Остальное- суета сует и томление духа.
0
silent_1991
25.04.2011, 01:11
  #14

Не по теме:

Цитата Сообщение от kravam Посмотреть сообщение
Остальное- суета сует и томление духа
ИМХО единственная суета - вручную работать со строками, когда всё уже написано до нас))))

0
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,542
Завершенные тесты: 3
25.04.2011, 01:13 #15
kravam,

C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
#include <string>
 
int main()
{
    std::string some_str = "klklkjkjkjnmxncmznjdfhjnczc,zxjmzj,fkkzlxmcx,czjfkjcm,zxcxnkalkjkasjda;l";
    std::cout<<sizeof(some_str)<<'\n';
    const char str[] = "klklkjkjkjnmxncmznjdfhjnczc,zxjmzj,fkkzlxmcx,czjfkjcm,zxcxnkalkjkasjda;l";
    std::cout<<sizeof(str);
}
Ну как бэ как-то так... 32 против 73... Если использовать конст указатель на char будет другое дело конечно, но все же.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.04.2011, 01:13
Привет! Вот еще темы с ответами:

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
25.04.2011, 01:13
Ответ Создать тему
Опции темы

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