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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 84, средняя оценка - 4.94
AlexP11223
52 / 53 / 8
Регистрация: 20.04.2011
Сообщений: 340
#1

Как создать динамический массив структур? - C++

01.11.2011, 00:29. Просмотров 11445. Ответов 39
Метки нет (Все метки)

А как работать с вектором если я хочу динамический массив структур?
т.е. допустим
C++
1
2
3
4
5
6
7
8
9
struct tovar
{
   string name;
   int cost;
};
 
...
 
vector <tovar> tovar_list;
И как теперь увеличить его размер на 1 и записать в этот элемент (структуру) какие-то данные (имя и цену в данном случае)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.11.2011, 00:29
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как создать динамический массив структур? (C++):

Создать динамический массив структур - C++
День добрый! Собственно задачка: Определить пользовательский тип (структуру), включающий в себя следующие поля: строка, целое число,...

Как объявить динамический массив структур, и как выглядит обращение к полям структур по указателю? - C++
Ребята подскажите как объявить динамический массив структур, и как выглядит обращение к полям структур по указателю.

C++ Как удалить динамический массив структур - C++
Как удалить массив структур, который был создан через new? Через deletedata, как заметил не чистится template &lt;typename T1, typename...

Как ввести данные в динамический массив структур? - C++
Подскажите пожалуйста, можно ли вводить данные в динамический массив структур c помощью cin &gt;&gt; следующим образом: #include &lt;iostream&gt; ...

Как создать динамический массив типа string? Как создать класс такого массива? - C++
Как создать динамический массив типа string? Как создать класс такого массива? =-O Помогите, пожалуйста, очень нужна помощь!

Динамический массив структур - C++
Нужно создать базу данных библиотеки состоящую из структур: книга, автор, количество читателей взявших эту книгу. Реализовать функции:...

39
Mr.X
Эксперт С++
3051 / 1696 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
02.11.2011, 01:25 #16
Цитата Сообщение от Bers Посмотреть сообщение
Ну а какой смысл вообще в том, что бы создавать объект абы где, а указатель на него держать в массиве? (даже если это умный указатель)
Это единственный выход, если в векторе нужно хранить полиморфные объекты-потомки одного базового класса. Размеры-то у них могут быть разные.
0
Bers
Заблокирован
02.11.2011, 02:16 #17
Цитата Сообщение от Mr.X Посмотреть сообщение
Это единственный выход, если в векторе нужно хранить полиморфные объекты-потомки одного базового класса. Размеры-то у них могут быть разные.
Ну я бы сказал - это единственный способ сделать простую имитацию, что якобы полиморфы живут в одном массиве.

Я с вашего позволения перефразирую вашу фразу:
"Если по задаче требуется единая точка доступа к группе объектов, создаётся вектор умных указателей на эти объекты".

(и совсем не обязательно, что бы это была группа однотипных, или полиморфных объектов. При желании можно состряпать такую имитацию, якобы в массиве хранятся объекты разных типов. Хотя это конечно сахар).

Но в том месте, где происходит непосредственно создание самого объекта, допустим, в недрах специализированной фабрики: CBase* ob = new CConcreteOb; можно решить жилищный вопрос реального объекта.

Для полиморфов можно создать несколько массивов.
Каждый конкретный объект определяется на местожительство в свой массив, а наружу отдаётся смартпоинтер на него.

Пожалуйста, вам нужна единая точка доступа к объектам - пихайте этот смартпоинтер в массив смартпоинтеров. Делайте с ним вообще все, что хотите.

Честно говоря, я удивлен, что в с++ до сих пор нет стандартизированной технологии, которая позволяла бы очередной созданный в куче объект-одиночку автоматически подсаживать в массив к своим собратьям-одиночкам, что бы одиночные объекты по всей памяти не болтались шаляй-валяй.

Грамотный объектный пул памяти + ОО-архитектура == высокая скорость, и надежность.
0
Jupiter
Каратель
Эксперт С++
6559 / 3980 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
02.11.2011, 02:59 #18
Цитата Сообщение от Bers Посмотреть сообщение
Пожалуйста, вам нужна единая точка доступа к объектам - пихайте этот смартпоинтер в массив смартпоинтеров.
контейнеры создавались для удобства, и "глупый" массив не всегда удовлетворяет требованиям
0
AlexP11223
52 / 53 / 8
Регистрация: 20.04.2011
Сообщений: 340
02.11.2011, 13:28  [ТС] #19
Сначала некотрое отступление. Уже имеется конструкция, которая реализует вашу структуру. Это шаблонный класс std:air Так что вы можете определить свой объект tovar, как
На самом деле там больше полей.

Так это, если без указателей, то как делать? Только вариант из 5 поста? А потом обращаться по tovar_list.back()->name и tovar_list[5]->name и т.д?
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,545
Завершенные тесты: 3
02.11.2011, 13:30 #20
Nubik756, Сделать конструктор. Хранить элементы не через указатель. Класть в вектор созданные объекты.
0
AlexP11223
52 / 53 / 8
Регистрация: 20.04.2011
Сообщений: 340
02.11.2011, 13:39  [ТС] #21
А можно пример? т.е. как-то так?
C++
1
2
3
4
5
6
7
8
9
10
11
struct tovar
{
   tovar(): name(0), cost(0)
   {}
   string name;
   int cost;
};
...
vector <tovar> tovar_list;
tovar_list.resize(1, tovar() );
tovar_list.back()->name = "Ananas";
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,545
Завершенные тесты: 3
02.11.2011, 13:45 #22
Nubik756, back возвращает последний объект содержащийся в векторе.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class tovar
{
public:
    tovar(const std::string& nm, int cst):name(nm), cost(cst)
    {
    }
private:
    std::string name;
    int cost;
};
 
typedef std::vector<tovar> tovar_list;
 
int main()
{
    std::vector<tovar> vec;
    vec.push_back(tovar("1", 1));
    vec.push_back(tovar("2", 2));
}
Геттеры/сеттеры сами припишите при необходимости
0
Bers
Заблокирован
02.11.2011, 13:51 #23
Цитата Сообщение от Nubik756 Посмотреть сообщение
А можно пример? т.е. как-то так?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
struct tovar
{
    tovar(): cost(0){}
    string name;
    int cost;
};
...
vector <tovar> tovar_list;
tovar_list.push_back ( tovar() ); //создадим безымяный объект на стеке,
                       // и добавим его копию в вектор
 
tovar_list.back()->name = "Ananas";  //доступ к последнему объекту
tovar_list[0].name = "Ananas"; //доступ к произвольному объекту
 
tovar& ITList = tovar_list[0]; //вытащим наружу ссылку на произвольный объект.
ITList.name = "Ananas"; //работа с объектом через ссылку.
/ps В гугле забанили, а книжки читать мы не любим, да?
0
AlexP11223
52 / 53 / 8
Регистрация: 20.04.2011
Сообщений: 340
02.11.2011, 14:05  [ТС] #24
Цитата Сообщение от ForEveR Посмотреть сообщение
back возвращает последний объект содержащийся в векторе.
я понял, именно это и хотел сделать в своем коде выше.
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,545
Завершенные тесты: 3
02.11.2011, 14:07 #25
Bers,
C++
1
 tovar_list.back()->name = "Ananas";  //доступ к последнему объекту
Это не будет работать.
0
Bers
Заблокирован
02.11.2011, 14:18 #26
Цитата Сообщение от ForEveR Посмотреть сообщение
Это не будет работать.
C++
1
tovar_list.rbegin()->name = "Ananas"; //доступ к последнему объекту
А так будит?


Кстати... вот щас втыкаю - почему не будит то?
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,545
Завершенные тесты: 3
02.11.2011, 14:22 #27
Bers, Да. Только на кой так извращаться?
И так тоже будет.

C++
1
2
std::vector<tovar>::iterator iter = tovar_list.insert(tovar_list.end(), tovar());
iter->name = "Ananas";
Я имел ввиду что back() возвращает ссылку или конст ссылку, а не итератор
0
Bers
Заблокирован
02.11.2011, 14:26 #28
аа... ну да. Ну над стрелочку заменить точечкой.
0
AlexP11223
52 / 53 / 8
Регистрация: 20.04.2011
Сообщений: 340
02.11.2011, 19:45  [ТС] #29
А если передавать вектор в функцию и т.д., то надо использовать ссылку или оно и так по не по значению, как и обычные массивы?
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,545
Завершенные тесты: 3
02.11.2011, 20:00 #30
Nubik756, По значению. Это же объект.
1
02.11.2011, 20:00
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.11.2011, 20:00
Привет! Вот еще темы с ответами:

Динамический массив структур - C++
Структура «Сотрудник» хранит имя, должность и возраст сотрудника. Структура «Компания» хранит название и массив сотрудников. Программа...

Динамический массив структур - C++
Нужно создать базу данных библиотеки состоящую из структур: книга, автор, количество читателей взявших эту книгу. Реализовать функции:...

Динамический массив структур - C++
Необходимо создать структуру, и сделать динамический массив структур. Фиксированный массив получается сделать, а вот с динамическим...

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


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

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

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