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

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

13.01.2016, 13:56. Показов 2314. Ответов 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
33374 / 21499 / 8235
Регистрация: 22.10.2011
Сообщений: 36,894
Записей в блоге: 11
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
33374 / 21499 / 8235
Регистрация: 22.10.2011
Сообщений: 36,894
Записей в блоге: 11
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
33374 / 21499 / 8235
Регистрация: 22.10.2011
Сообщений: 36,894
Записей в блоге: 11
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
33374 / 21499 / 8235
Регистрация: 22.10.2011
Сообщений: 36,894
Записей в блоге: 11
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
33374 / 21499 / 8235
Регистрация: 22.10.2011
Сообщений: 36,894
Записей в блоге: 11
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
33374 / 21499 / 8235
Регистрация: 22.10.2011
Сообщений: 36,894
Записей в блоге: 11
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
33374 / 21499 / 8235
Регистрация: 22.10.2011
Сообщений: 36,894
Записей в блоге: 11
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
Ответ Создать тему
Новые блоги и статьи
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а привычная функция main(). . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru