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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.69
Izual
 Аватар для Izual
93 / 118 / 6
Регистрация: 13.11.2012
Сообщений: 1,525
02.01.2014, 19:05     Нужен динамический контейнер, который будет соединять разные переменные, разных типов в блоки #1
В общем нужен динамический контейнер... который будет соединять разные переменные, разных типов в блоки.
Например есть поля Edit и Combo, после нажатия на кнопку, информация из заполненных полей будет помещяться в блок, расширение блоков нужно чтоб было примерно как в структуре, через операторы new и delete переопределять и копировать информацию.
Проблема в том что структура, на сколько мне известно не может держать в себе переменное кол-во членов(которое изменяется во время работы программы), т.е. мне наприпер в одном блоке нужно 4 char массива по 20 символов и один 300 символов, ещё туда же 2 int переменные и HWND например.
Как осуществить такую сложную динамику, и возможно ли объединять в структурные блоки переменные, которые могут позже удаляться например из блока или создавать новые в нутри одного блока (блок в моём понимании как строка из элементов ListView формы).
Возможно ли работать с структурой в таком режиме, если да то как?
И по возможности, прошу высказывать самые простые способы(т.е. например не такие сложные в синтаксисе как классы), идеальным для меня вариантом было бы использование структур(возможно вложенных или "дружественных")
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.01.2014, 19:05     Нужен динамический контейнер, который будет соединять разные переменные, разных типов в блоки
Посмотрите здесь:

C++ добавление в контейнер без указания типов данных?
C++ Как отсортирвоать контейнер, если его тип определяется по ходу выполнения программы? (динамическая идентификация типов)
Разделение строки на переменные разных типов C++
Статический контейнер для разных типов C++
C++ Решение задачи с массивам. Реализовать алгоритм, который будет считать количество в массиве разных букв
C++ Объявить переменные разных типов в заголовке for
C++ Привести примеры разных ситуаций, в который будет вызыватся конструктор копирования
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Убежденный
Системный программист
 Аватар для Убежденный
14473 / 6457 / 1020
Регистрация: 02.05.2013
Сообщений: 10,693
Завершенные тесты: 1
02.01.2014, 19:14     Нужен динамический контейнер, который будет соединять разные переменные, разных типов в блоки #2
Интересная задачка. Вряд ли можно на C++ такое сделать, статическая типизация ведь.
А как Вы видите себе использование такого контейнера ? Можно пример (псевдо)кода ?
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
02.01.2014, 19:21     Нужен динамический контейнер, который будет соединять разные переменные, разных типов в блоки #3
Для безымянных экземпляров классов типизация смешанная: статически типизируется иерархия и динамически фактический класс.
Izual
 Аватар для Izual
93 / 118 / 6
Регистрация: 13.11.2012
Сообщений: 1,525
02.01.2014, 19:40  [ТС]     Нужен динамический контейнер, который будет соединять разные переменные, разных типов в блоки #4
Я думаю, изначально создать с десяток структур по каждому виду переменной в структуре, например для int:
C++
1
2
3
4
5
struct integers
{
int N;
};
integers *na, interegs *nb;
При добавлении новой переменной вида int, она заносится в свою integer структуру...

Теперь далее, т.к. структура не поддерживает динамические массивы как члены, то в структуре, описывающюю какой либо объект, хранить число как кол-во членов в ней, а так же типы этих членов как "typedef enum" тип, на основе которого будет программа расфосовывать переменные. На основе этой структуры(объекта), создавать новую основанную на кол-ве членов и их типах, в этой структуре возможно переменные определять с помощью указателей(или даже просто числа, т.к. важен порядковый номер в базовой структуре, через который можно обратиться за данными) на переменные, хранящиеся в interegs и т.п. структурах.
Однако это лишь часть моей задумки, динамическое кол-во членов всё равно не сможет поддерживаться структурой, придётся возможно создавать структуры основанные на числе его членов как статическом, например для объектов будет 3 структуры по 5, 10 и 20 членов(как один массив внутри структуры), иначе если брать слишком много - будет утечка памяти в итоге, т.к. если мне нужна структура на 3 эл., а статически массив выделяется в структуре на 20 эл-во, а они так и не будут использованны, другое дело от 2 до 7 эл-ов...
Хотя мне так не нравится, код будет не красивым, желанной динамики не будет...
П.С. кстати, а можно ли узнать сколько памяти съела структура?.. например "N=20; na=new integers[N];"

Добавлено через 9 минут
Цитата Сообщение от taras atavin Посмотреть сообщение
Для безымянных экземпляров классов типизация смешанная: статически типизируется иерархия и динамически фактический класс.
Вы думаете что есть толк от того что вы сказали? =)
Простым языком пожалуйста, и если можно с примером реализации.
И опять же, я не хотел использовать классы, но если вариантов больше нет, то придётся... Однако мне нужен пруф, что без классов и т.п. мути типа векторов, работу с которыми вразумить тяжело... Читабиельность кода падает в разы.
Убежденный
Системный программист
 Аватар для Убежденный
14473 / 6457 / 1020
Регистрация: 02.05.2013
Сообщений: 10,693
Завершенные тесты: 1
02.01.2014, 20:05     Нужен динамический контейнер, который будет соединять разные переменные, разных типов в блоки #5
Цитата Сообщение от Izual Посмотреть сообщение
Я думаю, изначально создать с десяток структур по каждому виду переменной в структуре, например для int:
...
Теперь далее, т.к. структура не поддерживает динамические массивы как члены, то в структуре, описывающюю какой либо объект, хранить число как кол-во членов в ней, а так же типы этих членов как "typedef enum" тип, на основе которого будет программа расфосовывать переменные. На основе этой структуры(объекта), создавать новую основанную на кол-ве членов и их типах, в этой структуре возможно переменные определять с помощью указателей(или даже просто числа, т.к. важен порядковый номер в базовой структуре, через который можно обратиться за данными) на переменные, хранящиеся в interegs и т.п. структурах.
А не проще для таких задач использовать кодогенераторы ?
А вообще, мне сразу вспоминается тип VARIANT из COM:

VARIANT structure
http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx
Наглядный пример структуры, которая умеет хранить множество типов...

А вот советую еще заглянуть сюда, может убережет от написания очередного велосипеда:

Boost.Any
http://www.boost.org/doc/libs/1_55_0/doc/html/any.html
Izual
 Аватар для Izual
93 / 118 / 6
Регистрация: 13.11.2012
Сообщений: 1,525
03.01.2014, 00:25  [ТС]     Нужен динамический контейнер, который будет соединять разные переменные, разных типов в блоки #6
VARIANT - Чтобы хранить одну структуру, смешанного типа ?
Вообще я использую VARIANT для работы с Auto Excel, но обрабатывать все возможные типы возвращяемые VARIANT функциями не считаю нужным...
Да и проблема с типами меня мало тревожит, по сравнению с задачей по динамическому изменению кол-ва членов у объектов..
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
03.01.2014, 10:07     Нужен динамический контейнер, который будет соединять разные переменные, разных типов в блоки #7
Цитата Сообщение от Izual Посмотреть сообщение
Вы думаете что есть толк от того что вы сказали? =)
Простым языком пожалуйста, и если можно с примером реализации.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
class A
{
};
class B:A
{
};
class C:A
{
};
class D
{
};
class E:D
{
};
class F:D
{
};
A *a;
D *d;
a=new B; // можно, A и его потомки для безымянных указателей объектов, выделенных по указателю на A типизируются динамически
delete a;
a=new C; // можно, A и его потомки для безымянных указателей объектов, выделенных по указателю на A типизируются динамически
delete a;
a=new D; // нельзя, строгая статическая типизация
delete a;
a=new E; // нельзя, строгая статическая типизация
delete a;
a=new F; // нельзя, строгая статическая типизация
delete a;
d=new E; // можно, D и его потомки для безымянных указателей объектов, выделенных по указателю на D типизируются динамически
delete d;
d=new F; // можно, D и его потомки для безымянных указателей объектов, выделенных по указателю на D типизируются динамически
delete d;
d=new A; // нельзя, строгая статическая типизация
delete d;
d=new B; // нельзя, строгая статическая типизация
delete d;
d=new C; // нельзя, строгая статическая типизация
delete d;
Izual
 Аватар для Izual
93 / 118 / 6
Регистрация: 13.11.2012
Сообщений: 1,525
03.01.2014, 14:12  [ТС]     Нужен динамический контейнер, который будет соединять разные переменные, разных типов в блоки #8
taras atavin, что это? Как это использовать?... Как это решает задачу с динамическим изменением кол-ва членов по ходу работы программы?
Izual
 Аватар для Izual
93 / 118 / 6
Регистрация: 13.11.2012
Сообщений: 1,525
05.01.2014, 17:29  [ТС]     Нужен динамический контейнер, который будет соединять разные переменные, разных типов в блоки #9
Раз пока что адекватного выхода из первоначального вопроса не найдено, то думаю что обойдусь отдельной переменной в структуре, которая будет отвечать за номер блока, если он нужен.
Кстати столкнулся с небольшими трудностями:
1. Типа HWND в VARIANT структуре нет, где то на задворках яндекса что то невнятное говорили на английском, мол HWND можно считать как Long тип, хотя не понятно как обращяться с этим тогда.
2. Как сделать Нное кол-во массивов структур(хотя написал видимо не корректно). Поясню:
C++
1
2
3
4
5
6
7
8
9
int nl=10;
struct per
{
VARIANT type;
int blok;
char zn[20];
};
integers *na, interegs *nb;
na=new per[nl];
Я могу объявить новый массив только с именами, которые уже объявил: "na" и "nb". Как можно создать динамически новое имя?.. или может массив от одного имени?..
3. Тут же ещё одна неприятность, даже если я добавлю новую переменную в структуру, исходя из его типа мне нужно присвоить ему значение, т.е. для int - цыфру, для char - массив символов и т.п. Как заделать в структуре подобное? Я пока что не придумал(потому впихнул просто "char zn[20];", который можно методом atoi конвертировать, хотя 19 символов мне кажется не всегда будет достаточно), хотя начитал в интернете, что можно пользоваться неопределённым типом в указателях, например void *p; А потом уже присваивать тип ему и добавлять данные. ( но опять же, указатели не переменные, могут и потерятся, а если использовать доп. указатели, то может быть overhead адресации...
silent_1991
Эксперт C++
4946 / 3022 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
10.01.2014, 09:22     Нужен динамический контейнер, который будет соединять разные переменные, разных типов в блоки #10
Цитата Сообщение от taras atavin Посмотреть сообщение
Для безымянных экземпляров классов типизация смешанная: статически типизируется иерархия и динамически фактический класс.
Нет там никакой динамической типизации. Динамическое связывание не есть динамическая типизация.

Добавлено через 35 секунд
Izual, есть в бусте классы boost::any/boost::variant. Есть подобное и в Qt.
Izual
 Аватар для Izual
93 / 118 / 6
Регистрация: 13.11.2012
Сообщений: 1,525
10.01.2014, 16:05  [ТС]     Нужен динамический контейнер, который будет соединять разные переменные, разных типов в блоки #11
Суть задачи состоит в динамическом распределении переменных в динамическом двумерном массиве структур. Тип и значение которые возвращяет Variant лишь 1 из переменных измеряемой единицы, ещё нужно удобное обращение к переменным, т.е. их структуризация, при этом такое же лёгкое как в структуре, где всего 1 тип соединительного символа(точка).
silent_1991
Эксперт C++
4946 / 3022 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
10.01.2014, 17:37     Нужен динамический контейнер, который будет соединять разные переменные, разных типов в блоки #12
Izual, если все типы заведомо известны - можно попробовать union. Но тут другая загвоздка - для обращения к элементу union'а нужно заранее знать его тип. Короче говоря, универсального решения данной задачи в статически типизируемом языке вряд ли удастся добиться.

Добавлено через 51 секунду
Или погодите, у меня почему-то создаётся ощущение, что я неверно понял задачу...
Izual
 Аватар для Izual
93 / 118 / 6
Регистрация: 13.11.2012
Сообщений: 1,525
10.01.2014, 18:11  [ТС]     Нужен динамический контейнер, который будет соединять разные переменные, разных типов в блоки #13
Вы верно поняли, мне нужно создавать в блоки "двумерных массивов" переменные разных типов, например: создать таблицу, введите кол-во строк и столбцов, выберите типы данных в колонках, введите значения.

При этом я например хочу, чтоб в процессе работы я мог изменить тип в какой то колонке... Для этого я предполагаю, что если бы структура поддерживала динамические массивы типа: int mk[][];, но так к сожалению нельзя сделать... Потому проще использовать простые массивы, а их по доп. переменной уже сортировать(находить) среди структуры, содержащей все созданные\загруженные перменные.
Т.е. в конечном итоге это будет что то типа интерпритатора к собственным файлам параметров.
silent_1991
Эксперт C++
4946 / 3022 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
11.01.2014, 11:29     Нужен динамический контейнер, который будет соединять разные переменные, разных типов в блоки #14
Цитата Сообщение от Izual Посмотреть сообщение
если бы структура поддерживала динамические массивы типа: int mk[][]
С++ же. std::vector<std::vector<int> > - двумерный динамический массив.
Цитата Сообщение от Izual Посмотреть сообщение
Т.е. в конечном итоге это будет что то типа интерпритатора к собственным файлам параметров.
Тогда вам лучше организовать иерархию классов, каждый подкласс в иерархии будет представлять собственный тип данных в таблице, все они наследуются от какого-нибудь одного класса, в итоге в ячейках таблицы будут храниться указатели на базовый класс, которые будут указывать на объекты производных конкретных классов, каждый из которых будет хранить собственный тип данных.
Izual
 Аватар для Izual
93 / 118 / 6
Регистрация: 13.11.2012
Сообщений: 1,525
11.01.2014, 17:20  [ТС]     Нужен динамический контейнер, который будет соединять разные переменные, разных типов в блоки #15
мне придётся так делать, почему с самого начала я вообще хотел несколько структур, содержащих либо char buf[50] либо int zn как значение любой переменной.
silent_1991
Эксперт C++
4946 / 3022 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
11.01.2014, 22:49     Нужен динамический контейнер, который будет соединять разные переменные, разных типов в блоки #16
Цитата Сообщение от Izual Посмотреть сообщение
Но вся проблема в простоте читабиельности кода, я очень не хочу пользоваться классами и вектором в частности, т.к. такой вид данных трудно читается, в отличии от обычных структур, даже вложенных.
Очень спорное заявление. В использовании вектор такой же, как и обычные массивы (индексация) плюс такие плюшки, как расширение размера, которые явно читабельнее, чем перевыделение памяти и копирование из старой памяти в новую с последующим освобождением старой. А если не нравится, как выглядит объявление вектора, то пожалуйста - используйте typedef:
C++
1
2
3
4
5
6
7
8
typedef std::vector<int> int_array;
typedef std::vector<int_array> int_array_2d;
 
struct Foo {
    // ...
    int_array_2d arr;
    // ...
};
Цитата Сообщение от Izual Посмотреть сообщение
Кстати, а как это реализовать:
Не могли бы вы для начала описать задачу более полно? Чего вы пытаетесь добиться? Кто знает, вдруг проблему можно решить менее глобальным и общим способом, чем вы это себе представляете?
Izual
 Аватар для Izual
93 / 118 / 6
Регистрация: 13.11.2012
Сообщений: 1,525
12.01.2014, 04:48  [ТС]     Нужен динамический контейнер, который будет соединять разные переменные, разных типов в блоки #17
1. Ну я создал допустим fn *foo, через new например с 20 элементами. А как же я даже имея такую структуру смогу контролировать не только кол-во строк(кол-во эл.), но и кол-во столбцов(т.е. кол-во arr элементов, как например arr[10])?...

2. Задачки на динамику, после целого года работы над программой в WinApi (создаю собственну базу данных с связью авто экселя и парсинга), подумалось что надоело руками писать код постоянно один и тот же, только лишь меняя название массивов и др. перменных. Захотелось попробовать реализовать способ программирования через блок схемы с интерфейсом, это бы сильно упростило труд.
silent_1991
Эксперт C++
4946 / 3022 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
12.01.2014, 14:29     Нужен динамический контейнер, который будет соединять разные переменные, разных типов в блоки #18
Цитата Сообщение от Izual Посмотреть сообщение
1. Ну я создал допустим fn *foo, через new например с 20 элементами. А как же я даже имея такую структуру смогу контролировать не только кол-во строк(кол-во эл.), но и кол-во столбцов(т.е. кол-во arr элементов, как например arr[10])?...
Не очень понял, о чём вы спросили. Если речь о выделяемых вручную динамических массивах - вам надо отдельно хранить количество строк и столбцов, потому что на основе уже выделенной памяти размер этой памяти узнать невозможно (стандартными средствами, по крайней мере). Если речь о стандартном векторе - arr.size() вернёт количество строк, arr[i].size() - количество элементов в i-й строке (по сути количество столбцов, если принять, что количество элементов во всех строках совпадает, а в вашем случае это так и есть).
Цитата Сообщение от Izual Посмотреть сообщение
2. Задачки на динамику, после целого года работы над программой в WinApi (создаю собственну базу данных с связью авто экселя и парсинга), подумалось что надоело руками писать код постоянно один и тот же, только лишь меняя название массивов и др. перменных. Захотелось попробовать реализовать способ программирования через блок схемы с интерфейсом, это бы сильно упростило труд.
Опять же, мало что понял. О какой динамике речь? Если о динамическом программировании (что, по сути, является разделом математики, точнее теории оптимизации, а не программирования), то не понятно, при чём тут эксель и базы данных. Далее, что вы подразумеваете под программированием через блок-схемы? Вы пишете приложение для генерации кода на основе построенной пользователем блок-схемы (описания алгоритма работы программы на языке блок-схем)?
Не подумайте, я не издеваюсь, просто хочется понять проблему в той мере, чтобы её можно было попытаться решить.
Давайте так. Чтобы понять, зачем вам реализация обобщённых таблиц, мне не нужно знать полностью постановку вашей задачи. Мне нужно знать только постановку подзадачи, т.е. только той части, которая связана с использованием обобщённых таблиц в коде. Опишите, что бы вы хотели получить, как бы хотели работать с такими обобщёнными таблицами (можно написать пример на псевдокоде с С++-подобным синтаксисом, например).
Izual
 Аватар для Izual
93 / 118 / 6
Регистрация: 13.11.2012
Сообщений: 1,525
12.01.2014, 18:48  [ТС]     Нужен динамический контейнер, который будет соединять разные переменные, разных типов в блоки #19
1. Про векторы я вообще ничё не знаю, потому стандартный или нет - мне по фене Мне главное услышать или увидеть что моя задача по : "Динамическому заданию кол-ва строк и столбцов, а так же типов в них(на основе колонок)" может быть решаема не простыми массивами, а структурированнми данными.
Кол-во строк и столбцов вводимая\читаемая информация, так же как типы данных в них(например захочу в 2 колонке тип WORD, а в 5 - string, при этом было бы хорошо потом в процессе работы чтоб можно тоже было поменять.
Обычными структурами я хранил данные статичных типов и кол-ва столбцов(согласно кол-ву пременных структуры), а вот кол-во строк можно было изменить:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int nl=0;
char MainLV[12][12]={"№ строки", "Абонент", "Улица", "Дом", "Счётчик", "Марка", "Год", "Коэффициент", "Тариф", "Энергия", "Лицо", "Значность"};
int iMLV[12]={30, 80, 120, 60, 100, 70, 50, 50, 70, 70, 70, 50};
struct mainb
{
    char pn[5],ab[15],name[30],dom[10],nch[20],marka[20],god[5],koef[5],tarif[5],energy[10],lico[10],znach[5];
};
mainb *mac, mainb *mbc;
main:
nl=10;
mac=new mainb[nl];
for(int i=0;i<nl;i++)
    {
        lstrcpy(mac[i].ab, "ab");
        lstrcpy...
    }
Потом естественно расширять весь массив структур можно будет через второй указатель *mbc и увеличение nl.
Тут плотная привязка к кол-ву переменных в структуре, я могу сделать:
C++
1
2
3
4
struct tarif
{
    char m[12][10];
};
Но я явно укажу кол-во членов в строке, тут вариант до 12 элементов указывать, ну и добавить переменную которая будет указывать на тек. кол-во строк, и обращяться до этого числа. Получится что структура будет забирать больше памяти чем нужно... ну это я писал уже.

Если вектор может дать нужные мне возможности, то если есть кусочек кода что ли с примером обращения к таким членам и их использовании в конвертировании, я был бы рад его увидеть - для наглядности.

Добавлено через 6 минут
П.С.
является разделом математики, точнее теории оптимизации, а не программирования
*И программирования, так как процессу логического мышления отделяется "львиная доля". Ну в принципе, хочу интерфейс и возможности чуть по расширенней чем в программе Excel, вот и думаю над базовыми алгоритмами, которые уже используются, но в статическом варианте(как было показано). Блок схемы это в прямом понимании структурирование элементов кода, таких как операторы - в интерфейс\лог.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.01.2014, 06:55     Нужен динамический контейнер, который будет соединять разные переменные, разных типов в блоки
Еще ссылки по теме:

C++ Считать слова из файла в разные переменные
C++ Нужен алгоритм, который будет считать формулу, введённую пользователем в виде строки
C++ Как реализовать класс Pricelist, который будет содержать динамический массив объектов Model
Контейнер, наследование и разные типы данных C++
Как поместить в STL-контейнер экземпляры разных классов? C++

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

Или воспользуйтесь поиском по форуму:
silent_1991
Эксперт C++
4946 / 3022 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
13.01.2014, 06:55     Нужен динамический контейнер, который будет соединять разные переменные, разных типов в блоки #20
Цитата Сообщение от Izual Посмотреть сообщение
Если вектор может дать нужные мне возможности, то если есть кусочек кода что ли с примером обращения к таким членам и их использовании в конвертировании, я был бы рад его увидеть - для наглядности.
Вектор может дать вам только те же возможности, что и стандартные массивы плюс такие дополнительные вещи, как динамическое расширение размера, получение текущего размера, ну и множество дополнительных полезных методов, о которых можно почитать в документации по стандартной библиотеке. Сам вектор строго типизированный, он не позволит сам по себе выбирать тип элемента, это надо писать самостоятельно либо пользоваться уже упомянутыми мною boost::any/boost::variant.
Вот пример работы с вектором (заполнение и вывод на экран двумерной матрицы с динамическим добавлением элементов в вектор)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <iostream>
#include <vector>
#include <cstdlib>
#include <ctime>
 
// Вспомогательная функция, возвращает случайное число в промежутке [lower, upper)
int get_random_value(int lower, int upper)
{
    return static_cast<int>(lower + (upper - lower) * static_cast<double>(std::rand()) / RAND_MAX);
}
 
int main() {
    // Инициализация генератора случайных чисел
    std::srand(static_cast<unsigned>(std::time(0)));
    
    // Создаём матрицу. Пока она пустая, размера 0x0
    std::vector<std::vector<int> > matrix;
    int rows, cols;
    
    // Генерируем случайный размер матрицы
    rows = get_random_value(2, 7);
    cols = get_random_value(2, 7);
    
    // Заполняем матрицу
    for (int i = 0; i < rows; ++i) {
        // Создаём пустую строку матрицы
        std::vector<int> row;
        // Заполняем строку
        for (int j = 0; j < cols; ++j) {
            // С помощью метода push_back помещаем очередной элемент в конец строки
            // Расширение размера строки происходит автоматически
            row.push_back(get_random_value(-10, 10));
        }
        
        // Помещаем строку в конец матрицы
        // Расширение количества строк также происходит динамически
        matrix.push_back(row);
    }
    
    // Выводим сгенерированную матрицу
    // Метод size() возвращает количество элементов в векторе, т.е. в данном
    // случае по сути количество строк матрицы
    for (int i = 0; i < matrix.size(); ++i) {
        // Выводим очередную строку. Метод size вернёт размер строки
        for (int j = 0; j < matrix[i].size(); ++j) {
            // Индексируем матрицу. В данном случае оператор matrix[i] возвращает
            // ссылку на i-ую строку матрицы, к которой мы также применяем
            // оператор индексации для получение ссылки на j-й элемент строки
            std::cout << matrix[i][j] << "\t";
        }
        
        std::cout << std::endl;
    }
    
    return 0;
}
Я специально написал код, который добавляет все элементы динамически. На самом деле в данном случае правильнее было бы выделить всю матрицу сразу вот так:
C++
1
2
int rows = get_random_value(2, 7), cols = get_random_value(2, 7);
std::vector<std::vector<int> > matrix(rows, std::vector<int>(cols, 0));
Здесь используется форма конструктора, принимающего количество элементов и инициализирующий элемент. Для вектора первого уровня количество элементов соответствует количеству строк, а инициализирующим элементом является строка - вектор размером cols с инициализирующим элементом 0.
В этом случае для такой матрицы уже не нужно использовать оператор push_bakc (вся нужная память уже выделена), а работать с ней необходимо сразу через индексацию. Вывод не будет отличаться от приведённого в коде выше, а вот заполнение уже нужно выполнять так:
C++
1
2
3
4
5
for (int i = 0; i < matrix.size(); ++i) {
    for (int j = 0; j < matrix[i].size(); ++j) {
        matrix[i][j] = get_random_value(-10, 10);
    }
}
Также стандартные векторы (как и любые стандартные контейнеры) поддерживают итераторы, с помощью которых удобно и, что главное, переносимо (т.е. независимо от фактического типа контейнера) перемещаться по контейнеру.
Векторы позволят вам решить эту проблему:
Цитата Сообщение от Izual Посмотреть сообщение
Получится что структура будет забирать больше памяти чем нужно...
Yandex
Объявления
13.01.2014, 06:55     Нужен динамический контейнер, который будет соединять разные переменные, разных типов в блоки
Ответ Создать тему
Опции темы

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