Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
 Аватар для Хулиган
88 / 83 / 21
Регистрация: 08.08.2012
Сообщений: 737

Как создать экземпляр контейнера, содержащий контейнеры и т.д

21.05.2015, 23:06. Показов 1290. Ответов 23
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер! как это можно сделать, не создавая вспомогательных классов?!
C++
1
std::map<int, std::map<int, std::map<int, ...> > >  coll;
Добавлено через 26 минут
????

Добавлено через 34 минуты
???
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.05.2015, 23:06
Ответы с готовыми решениями:

Как создать правый и левый контейнеры
Я тут искал, искал нечего не нашел, все делают для ucoz, а мне бы без ucoz, желательно инклуд, что бы на все страинцы мог выдавать

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

Как создать шаблон класса, который сможет принимать в качестве значения любые stl контейнеры
Как написать класс, в который можно засунуть vector&lt;int&gt;, или vector&lt;float&gt;, или deque&lt;double&gt; и т.д?

23
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
21.05.2015, 23:12
Хулиган, Имхо, вопрос задан непонятно, поэтому никто не отвечает.
Например, не понятно что значит в твоем понимании "не создавая вспомогательных классов".

Рискну предположить, что нужно нечто такое (С++11):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    std::map<int, std::map<int, std::map<int, int> > >  coll {
       { 1
       , std::map<int, std::map<int, int> > {
            { 1, std::map<int, int>{ { 1, 2}, { 2, 4 } } }
          , { 2, std::map<int, int>{ { 1, 2}, { 2, 4 } } }
         }
       }
     , { 2
       , std::map<int, std::map<int, int> > {
            { 1, std::map<int, int>{ { 1, 2}, { 2, 4 } } }
          , { 2, std::map<int, int>{ { 1, 2}, { 2, 4 } } }
         }
       }
    };
0
 Аватар для Nosey
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
21.05.2015, 23:13
Хулиган, он у вас уже создан вот этим:
C++
1
std::map<int, std::map<int, std::map<int, int> > > coll;
0
 Аватар для Хулиган
88 / 83 / 21
Регистрация: 08.08.2012
Сообщений: 737
21.05.2015, 23:16  [ТС]
DrOffset, ну типо связный список из MAPов, по ключу можно выбрать ветку следующих map. Реальной задачи нет, просто стало интересно возможно ли такое?
0
 Аватар для Nosey
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
21.05.2015, 23:19
Хулиган, В С/С++ всё возможно, и 40-мерные массивы/вектора/контейнеры - не исключение.
Смотрите у DrOffset заполненный экзампл.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
21.05.2015, 23:20
Цитата Сообщение от Хулиган Посмотреть сообщение
Реальной задачи нет, просто стало интересно возможно ли такое?
Ну да. Возможно.
0
 Аватар для Хулиган
88 / 83 / 21
Регистрация: 08.08.2012
Сообщений: 737
21.05.2015, 23:24  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Ну да. Возможно.
Nosey, возможно я неправильно описал задачу. В приведенном примере 3 уровня контейнеров, последний
C++
1
map<int, int>
а я хотел
C++
1
map<int, map<int, map<и т.д.>>
т.е можно достигнуть абсолютно любой глубины.
0
 Аватар для Nosey
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
21.05.2015, 23:33
Цитата Сообщение от Хулиган Посмотреть сообщение
т.е можно достигнуть абсолютно любой глубины.
Наверное я понял, вы о статических данных и динамических спрашиваете, желаете сделать бесконечную вложенность без динамики, это невозможно, ибо компилятор сгенерирует бесконечный код

Вы можете описать статически любую вложенность, но не бесконечную и явно определённую на этапе компиляции.
Тут можно и шаблонами побаловаться если лень N вложенных мапов писать. Но N всё равно должна быть доступна на этапе компиляции.

В случае динамики, то соответственно можно приблизиться к бесконечности, если памяти хватит и такая бесконечность вас устроит
1
 Аватар для Хулиган
88 / 83 / 21
Регистрация: 08.08.2012
Сообщений: 737
21.05.2015, 23:36  [ТС]
Цитата Сообщение от Nosey Посмотреть сообщение
Наверное я понял, вы о статических данных и динамических спрашиваете, желаете сделать бесконечную вложенность без динамики, это невозможно, ибо компилятор сгенерирует бесконечный код
ну можно хранить указатель на следующий map в значении текущего map и потом по необходимости выделять память. Но вот как это все описать?
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
21.05.2015, 23:44
Цитата Сообщение от Хулиган Посмотреть сообщение
т.е можно достигнуть абсолютно любой глубины.
Речь о том, чтобы рекурсивно проинстанцировать тип самим собой?
Напрямую нельзя.
Только через вспомогательный тип.

Добавлено через 3 минуты
Хулиган,
C++
1
2
3
4
5
6
7
8
9
template <typename Key>
struct map_type
{
    std::map<Key, map_type *> value;
};
 
//......
 
map_type<int> coll;
1
 Аватар для Хулиган
88 / 83 / 21
Регистрация: 08.08.2012
Сообщений: 737
21.05.2015, 23:47  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Речь о том, чтобы рекурсивно проинстанцировать тип самим собой?
да это оно. а я думал что это все таки возможно, ну и ладно
0
 Аватар для Nosey
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
21.05.2015, 23:50
Цитата Сообщение от Хулиган Посмотреть сообщение
да это оно. а я думал что это все таки возможно, ну и ладно
Возможно, но только на определённую глубину, к тому же не стоит большую глубину делать
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
template<int N>
struct MagicMap
{
    typedef std::map<int, typename MagicMap<N - 1>::type> type;
};
 
template<>
struct MagicMap<0>
{
    typedef std::map<int, int> type;
};
 
int main()
{
    MagicMap<10>::type map;
    return 0;
}
0
 Аватар для Хулиган
88 / 83 / 21
Регистрация: 08.08.2012
Сообщений: 737
21.05.2015, 23:53  [ТС]
Nosey, спасибо, такой вариант я знаю. Но в описании темы я написал же НЕ СОЗДАВАЯ ВСПОМОГАТЕЛЬНЫХ КЛАССОВ!
0
 Аватар для Nosey
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
21.05.2015, 23:57
Цитата Сообщение от Хулиган Посмотреть сообщение
Nosey, спасибо, такой вариант я знаю. Но в описании темы я написал же НЕ СОЗДАВАЯ ВСПОМОГАТЕЛЬНЫХ КЛАССОВ!
Понял, откланиваюсь, ну и кроме как моим и DrOffset способом сделать нельзя.

Не по теме:

Осталось лишь решить философский вопрос считать ли typedef вспомогательным классом :):)

0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
21.05.2015, 23:59
Цитата Сообщение от Хулиган Посмотреть сообщение
а я думал что это все таки возможно
Имя типа должно быть доступно, чтобы на него можно было ссылаться.
В случае с шаблоном этого не происходит. Т.к. чтобы сформировать тип, нам нужно подставить аргументы, но один из аргументов - это тот же самый еще не сформированный тип. Получается логическая ловушка.
Чтобы разорвать ее, приходится вводить еще одну сущность, с которой все начнется и которая уже имеет определенный тип.
0
 Аватар для Хулиган
88 / 83 / 21
Регистрация: 08.08.2012
Сообщений: 737
22.05.2015, 00:05  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Получается логическая ловушка.
получается на разные уровни в качестве значения мы можем запихнуть все что угодно?
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
22.05.2015, 00:11
Цитата Сообщение от Хулиган Посмотреть сообщение
получается на разные уровни в качестве значения мы можем запихнуть все что угодно?
Не очень понял о чем вопрос.
В моем примере на разные уровни мы запихиваем указатель на один и тот же класс, но с разными значениями. Получается дерево.
Работает это потому, что map_type - это готовый тип, когда мы подставили int в качестве ключа. Поэтому мы можем взять указатель на него и поместить в map. map при этом тоже становится законченным типом, т.к. все аргументы шаблона определены строго.
0
 Аватар для Хулиган
88 / 83 / 21
Регистрация: 08.08.2012
Сообщений: 737
22.05.2015, 00:23  [ТС]
DrOffset, все верно, то я просто немного затупил
0
What a waste!
 Аватар для gray_fox
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
23.05.2015, 02:41
DrOffset, ну так то некоторые шаблоны можно инстанциировать неполным типом, и тогда возможны рекурсивные типы данных без всяких указателей.
0
 Аватар для Хулиган
88 / 83 / 21
Регистрация: 08.08.2012
Сообщений: 737
23.05.2015, 10:10  [ТС]
Цитата Сообщение от gray_fox Посмотреть сообщение
ну так то некоторые шаблоны можно инстанциировать неполным типом, и тогда возможны рекурсивные типы данных без всяких указателей.
если нетрудно приведите пример
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
23.05.2015, 10:10
Помогаю со студенческими работами здесь

Как создать экземпляр класса?
Как создать экземпляр класса? Что я написал неправильно? ferr := TMachine.Create; здесь ошибка(81 строка). unit Unit1; ...

Как создать экземпляр класса
Доброго вечера. Уже запутался и не могу понять что делать - есть класс ref class Mnos { ... } { Далее при запуске программы...

Как создать экземпляр класса?
Мне нужно создать 2 экземпляра любого класса и прицепить их на любой компонент или к его свойству(может я задание неправильно поняла). Но я...

как создать экземпляр ui->TabWidget?
Добрый день.Захотелось мне, чтобы программа при открытии файла создавала вкладку новую для него.И чтобы в этой вкладке уже были контролы...

Как создать экземпляр этого класса?
#pragma once template&lt;typename T&gt; class fgFSM { public: fgFSM() : _time_in_cur_state(0.0f), _cur_state(-1) { }


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru