С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
10 / 10 / 4
Регистрация: 12.10.2013
Сообщений: 249

Предельный размер списка типа vector

13.01.2016, 13:56. Показов 2311. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В программе возникает ошибка, которую не могу понять.
Есть двухмерный массив данных
C++
1
std::vector<std::vector<int> > myvector;
Я его заполняю одномерными векторами, включающими в себя 15 значений типа int.
Таких одномерных векторов я создаю 32768 штук. То есть последний элемент моего двухмерного массива имеет такую индексацию
C++
1
myvector[32767][14]
Я вывожу все данные двухмерного массива в Memo. Программа немного зависает, но с работой справляется.

А вот на следующем шаге проблема. Мне нужно одномерные массивы составлять из 16-ти значений и должно быть таких массивов вдвое больше предыдущего шага - 65536 штук. Программа закрывается с ошибкой. В режиме отладки вот такой текст ошибки:
Миниатюры
Предельный размер списка типа vector  
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
13.01.2016, 13:56
Ответы с готовыми решениями:

Как можно увеличить размер вектора, который является элементом вектора vector<vector<int>>arr(n, vector <int>)
Написал программу, которая создает вектор 'а' векторов 'b', вектора 'b' содержат 2 числа. Стало интересно, как нужно изменить программу...

Предельный угол полного внутреннего отражения и предельный угол преломления для поверхности это одно и тоже или это разные понятия?
Найти предельный угол полного внутреннего отражения и предельный угол преломления для поверхности раздела стекло-вода стекло 1,55 вода 1,33...

Как передать целочисленную матрицу типа std::vector<std::vector<int> > в функцию?
Здравствуйте. Почитал на форуме, но так и не понял что я делаю не так. Имеется двумерный вектор. Размера .. Нужно его передать в...

21
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33369 / 21495 / 8234
Регистрация: 22.10.2011
Сообщений: 36,893
Записей в блоге: 12
13.01.2016, 14:41
Очень странно.
C++
1
    std::vector<std::vector<int> > myvector(65536, std::vector<int>(16, 0));
не вызывает никакой ошибки, хотя тут и есть 65536 массивов по 16 элементов в каждом.
1
10 / 10 / 4
Регистрация: 12.10.2013
Сообщений: 249
13.01.2016, 15:54  [ТС]
Хм. Если просто задать такой двухмерный массив, то он, вроде, заполняется нормально. А в рамках моей программы - нет. Во вложении моя тестовая программка, которая составляет всевозможные комбинации произвольного количества элементов. То есть например есть 3 элемента, у них могут быть следующие комбинации:
1,1,1
0,1,1
1,0,1
1,1,0
0,0,1
0,1,0
1,0,0
0,0,0

Здесь "1" означает - элемент присутствует в комбинации, "0" - отсутствует.

Когда задаю 15 элементов - программа обрабатывает, а 16 - уже нет. Код, наверное, сложный для понимания, но может у вас получится легко найти принципиальную ошибку?
Вложения
Тип файла: zip Новая папка (10).zip (47.6 Кб, 6 просмотров)
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33369 / 21495 / 8234
Регистрация: 22.10.2011
Сообщений: 36,893
Записей в блоге: 12
13.01.2016, 16:14
А на кой весь этот код вообще? Что, запустить цикл от 2n-1 до 0, преобразовать каждое число в двоичную запись и вывести в Memo с запятой между значениями разрядов - очень сложно?
0
10 / 10 / 4
Регистрация: 12.10.2013
Сообщений: 249
13.01.2016, 16:41  [ТС]
Цитата Сообщение от volvo Посмотреть сообщение
А на кой весь этот код вообще? Что, запустить цикл от 2n-1 до 0, преобразовать каждое число в двоичную запись и вывести в Memo с запятой между значениями разрядов - очень сложно?
Это просто модель. В реальной программе там не 0 и 1, а пользовательские типы.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33369 / 21495 / 8234
Регистрация: 22.10.2011
Сообщений: 36,893
Записей в блоге: 12
13.01.2016, 16:43
Ну и какая разница? Моделируешь для 0 и 1, вместо них при обработке подставляешь пользовательские типы. Результат-то тот же самый, у тебя в vector-ах хранятся только 0 и 1.
0
10 / 10 / 4
Регистрация: 12.10.2013
Сообщений: 249
13.01.2016, 17:58  [ТС]
Нет, в векторах 0 и 1 это только в тестовом примере, который я сделал для отработки алгоритма создания всевозможных сочетаний произвольного количества элементов. В реальности же программа будет оперировать пользовательскими типами и там, где тестовая задача заносит в список 0 - будут выполняться определенные действия и в vector будет заноситься динамически созданный объект пользовательского типа. Так же и вместо 1-цы будет пользовательский объект.

По моему коду сложно разобраться в ошибке? Там само наполнение векторов происходит в функции CreateCombination, где в цикле происходит пробежка по всем элементом и сравнение их значений с элементами вектора indices, в котором содержатся индексы элементов, которым назначается значение 0 в составляемой комбинации. Я так думаю, что именно здесь происходит переполнение то ли вектора, то ли еще чего-то... ведь текст ошибки говорит именно о переполнении?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33369 / 21495 / 8234
Регистрация: 22.10.2011
Сообщений: 36,893
Записей в блоге: 12
13.01.2016, 18:16
Текст говорит о переполнении стека, что ж ты хотел с такой вложенностью рекурсии. Можно попробовать увеличить размер стека в настройках опций проекта:



Так уже работает для 16-ти.
1
10 / 10 / 4
Регистрация: 12.10.2013
Сообщений: 249
13.01.2016, 18:33  [ТС]
Да. А для 17-ти - уже нет. А почему стек переполняется? Как на это влияют рекурсивные функции? И можно ли значительно увеличивать максимальный размер стека по сравнению со значением по умолчанию (0х00100000)?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33369 / 21495 / 8234
Регистрация: 22.10.2011
Сообщений: 36,893
Записей в блоге: 12
13.01.2016, 18:48
Цитата Сообщение от Нитонисе Посмотреть сообщение
А почему стек переполняется? Как на это влияют рекурсивные функции?
А потому что как раз в стеке и размещаются функции в момент вызова. Но ладно бы, если просто функция - загрузилась в стек, отработала, выгрузилась. А поскольку рекурсия - то функция вызывает саму себя, следовательно, не заканчиваясь, грузит еще одну копию в стек, потом еще одну, и так далее, по нарастающей. Естественно, в какой-то момент стек переполняется.
Цитата Сообщение от Нитонисе Посмотреть сообщение
можно ли значительно увеличивать максимальный размер стека по сравнению со значением по умолчанию (0х00100000)?
Можно. До 2 Гб, то есть 0x7FFFFFFF (больше тебе не дадут увеличить, попробуй внести 0x80000000 - увидишь)
0
10 / 10 / 4
Регистрация: 12.10.2013
Сообщений: 249
13.01.2016, 19:07  [ТС]
Цитата Сообщение от volvo Посмотреть сообщение
Можно. До 2 Гб, то есть 0x7FFFFFFF
А у этой меры есть какие-то негативные последствия?

Добавлено через 12 минут
Может быть у меня основная идея с рекурсией неудачная?
Вот как бы выглядел цикл составления комбинаций из count элементов, где в разных вариантах три элемента имеют значение 0, а все остальные 1.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
for (int a=0; a<count-2; a++)
{
    for (int b=a+1; b<count-1; b++)
    {
        for (int c=b+1; c<count; c++)
        {
            for (int d=0; d<count; d++)
            {
                if (d == a || d == b || d == c)
                {
                    // добавляем 0
                }
                else
                {
                    // добавляем 1
                }
            }
        }
 
    }
}
Ясно, что для случая 4-ех и более нулей в комбинации - будут добавляться вложенные циклы. Меньше 2-ух нулей - циклы наоборот уберутся. Но вся проблема в том, что количество комбинируемых элементов определяется пользователем программы и хочется, чтобы программа могла работать с как можно бОльшим их количеством.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33369 / 21495 / 8234
Регистрация: 22.10.2011
Сообщений: 36,893
Записей в блоге: 12
13.01.2016, 19:24
Есть. Тебе столько памяти ОС не даст. Максимум, на что ты можешь рассчитывать в 32-битной ОС - это на общую память в 1.7Gb. Сюда входят все статические данные (глобальные переменные), динамические данные (куча) и стек. В 64-х битах с динамическими данными получше (там уже ограничение в 8 терабайт), но статические данные и стек по-прежнему ограничены 2-мя гигабайтами. Так что даже в 64-битах максимум, что ты сможешь получить - это 2Gb стека.
1
10 / 10 / 4
Регистрация: 12.10.2013
Сообщений: 249
25.01.2016, 12:56  [ТС]
Я изменил рекурсивную функцию. Она стала проще и теперь позволяет обрабатывать 22 элемента из которых составляется 4 164 304 комбинаций. На следующем шаге должно быть 23 элемента и вдвое больше комбинаций, но программа выдает ошибку "External exception EEFFACE". Что означает эта ошибка?

Попробовал просто заполнить двухмерный массив (вектор из 8 388 608 векторов по 23 значений типа int в каждом) - получил ту же самую ошибку. Значит дело не в рекурсивной функции и переполнении стека. Может все-таки достигнут предельный размер списка типа vector?
0
10 / 10 / 4
Регистрация: 12.10.2013
Сообщений: 249
25.01.2016, 13:02  [ТС]
Если запустить программу в режиме отладки, то возникает другая ошибка (см. вложение).
Миниатюры
Предельный размер списка типа vector  
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
25.01.2016, 16:00
Это как раз памяти не хватает, можешь попробовать использовать дек или список они не требуют сплошного куска памяти.

std::vector::max_size()
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33369 / 21495 / 8234
Регистрация: 22.10.2011
Сообщений: 36,893
Записей в блоге: 12
25.01.2016, 16:02
Цитата Сообщение от Avazart Посмотреть сообщение
При чем тут стек
При том, что изначально у ТС-а была рекурсия, которая выжирала весь стек напрочь.
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
25.01.2016, 16:06
Цитата Сообщение от volvo Посмотреть сообщение
При том, что изначально у ТС-а была рекурсия, которая выжирала весь стек напрочь.
Вы этой теме чет нет кода с рекурсией.
0
10 / 10 / 4
Регистрация: 12.10.2013
Сообщений: 249
25.01.2016, 16:54  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Это как раз памяти не хватает
Функция max_size() возвращает значение 1 073 741 823. Это гораздо больше, чем кол-во элементов при котором моя программа сбоит. Тут, видимо, имеет еще значение и объем данных? У меня, видимо, вектор пытается зарезервировать больше памяти, чем доступно? Увеличение ОЗУ позволит преодолеть мой лимит в 22 элемента?

Добавлено через 3 минуты
Цитата Сообщение от Avazart Посмотреть сообщение
Вы этой теме чет нет кода с рекурсией.
Я выкладывал проект в посте #3. Там код сложный для восприятия. Сейчас я его переделал, но он тоже не сказать что простой. Но суть не в коде, а в ошибке. Если раньше было переполнение стэка, то сейчас - нехватка памяти. Реально ли, что при заполнении вектора векторами по 23 int'а (двухмерный массив) в количестве более 8 млн памяти будет не хватать? Тут, видимо, какие-то особенности динамического выделения памяти вектором.
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
25.01.2016, 17:24
Цитата Сообщение от Нитонисе Посмотреть сообщение
Функция max_size() возвращает значение 1 073 741 823. Это гораздо больше, чем кол-во элементов при котором моя программа сбоит.
Тут имеется ввиду макс. кол-во элементов,а не их общий размер под них.

Добавлено через 50 секунд
Цитата Сообщение от Нитонисе Посмотреть сообщение
У меня, видимо, вектор пытается зарезервировать больше памяти, чем доступно? Увеличение ОЗУ позволит преодолеть мой лимит в 22 элемента?
Оно пытается зарезервировать один сплошной кусок память, и да вполне вероятно с запасом, т.е больше чем вы запрашиваете это же вектор.

Добавлено через 3 минуты
Цитата Сообщение от Нитонисе Посмотреть сообщение
Увеличение ОЗУ позволит преодолеть мой лимит в 22 элемента?
22 элемента это 22 элемента, а не количество памяти выделенных под объекты заданного типа.

Добавлено через 45 секунд
Цитата Сообщение от Нитонисе Посмотреть сообщение
Но суть не в коде, а в ошибке.
Суть в нежелании учится и читать книги.

Добавлено через 9 минут
volvo тебе объяснил какой размер оперативки приблизительно тебе может быть доступен, соответственно бери калькулятор и считай байты:
C++
1
myvector.size()*myvector[0].size()*sizeof(UserType);
0
10 / 10 / 4
Регистрация: 12.10.2013
Сообщений: 249
25.01.2016, 18:49  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
соответственно бери калькулятор и считай байты
Я посчитал: 8 388 608 * 23 * 4 = 771 751 936 байт. То есть 772 Мб. У меня ОЗУ гораздо больше. Понятно, что часть выделяется под нужды ОС, но тем не менее. Вроде бы 772 Мб это не критически много? Если я правильно понимаю, то тут ошибка в расчетах в том, что вектор в 23 int'а занимает не 23*4=92 байта, а больше, так как вектор динамически выделяет памяти больше чем нужно? Так же вектор векторов наверное имеет размер больше чем нужно из-за выделения памяти всегда немного про запас? То есть реально может быть под мои данные выделится, скажем 1 Гб. Но ведь и такой объем данных не представляется чрезмерным.

Попутный вопрос. Можно ли как-то контролировать выделение памяти вектором? Чтобы экономично расходовать память.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.01.2016, 18:49
Помогаю со студенческими работами здесь

Не удаётся создать безымянный объект типа vector моего типа
Собсно #include &lt;vector&gt; using namespace std; //Вот мой австорский тип struct kletka { int i, j; kletka(int x, int...

Как изменять размер std::vector<std::vector>?
Здравствуйте, как нужно изменять размер std::vector&lt;std::vector&gt; например: std::vector&lt;std::vector&lt;float&gt;&gt; data; ...

размер vector'a
как узнать размер двумерного вектора отдельно по вертикали и горизонтали

Vector.insert ругается на размер
#include &lt;QCoreApplication&gt; #include &lt;list&gt; #include &lt;iostream&gt; #include &lt;vector&gt; using namespace std; void vivod(vector&lt;int&gt;...

Какой максимальный размер vector?
Добрый день! Пишу программку и на строчке for (int i = 0; i &lt; vec.size(); ++i) { // do something; } Задумался, что vec...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru