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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 21, средняя оценка - 4.81
luck
0 / 0 / 0
Регистрация: 06.07.2012
Сообщений: 63
#1

Динамический массив с большим количеством элементов - C++

13.03.2013, 00:15. Просмотров 2948. Ответов 61
Метки нет (Все метки)

Нужно создать динамический массив (каждый элемент целое положительное число до 10^9), который по введенным данным создавал N элементов массива, где N может быть до 10^5.

unsigned long int *arr = new unsigned long int[num];

Я сделал так, но если количество элементов больше 45920, то выводит ошибку
"terminate called after throwing an instance of 'std::bad_alloc'
what(): std::bad_alloc
This application has requested the Runtime to terminate it in unuasual way.
Please contact the application's support team for more information."
IDE Qt Creator.
Статические массивы типа int array[1000000]; сразу выводят ошибку, причем в обоих случая изменение типа элементов массива ничего не меняет.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.03.2013, 00:15     Динамический массив с большим количеством элементов
Посмотрите здесь:
C++ Создать с помощью new динамический массив с указанным количеством элементов
C++ Применение массивов случайных чисел с большим количеством элементов
C++ Реализовать обработку и файловую запись/чтение массива с большим количеством элементов
Строки матрицы, с большим количеством положительных элементов расположить выше остальных C++
Удалить строку с самым большим количеством слов C++
C++ Алгоритм быстрой сортировки не работает с большим количеством чисел
Определить номер строки матрицы с наиболее большим количеством нулей C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Avazart
Эксперт С++
7117 / 5294 / 273
Регистрация: 10.12.2010
Сообщений: 23,413
Записей в блоге: 17
13.03.2013, 02:50     Динамический массив с большим количеством элементов #16
Цитата Сообщение от ValeryS Посмотреть сообщение
unsigned long long* tst1=new unsigned long long[1000000];
Это может работать от случая к случаю...
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
13.03.2013, 02:51     Динамический массив с большим количеством элементов #17
Почему? 8 мегабайт — это я не знаю, как надо усиленно загадить кучу перед этим, чтобы оно работало от случая к случаю.
ValeryS
Модератор
6551 / 5017 / 463
Регистрация: 14.02.2011
Сообщений: 16,733
13.03.2013, 02:51     Динамический массив с большим количеством элементов #18
Цитата Сообщение от Avazart Посмотреть сообщение
Это будет работать от случая к случаю...
если нет утечки и память не фрагментируется постоянными new delete то почему бы и нет
gray_fox
What a waste!
1443 / 1172 / 61
Регистрация: 21.04.2012
Сообщений: 2,451
Завершенные тесты: 3
13.03.2013, 02:53     Динамический массив с большим количеством элементов #19
Цитата Сообщение от luck Посмотреть сообщение
сделать двумерный массив 10^5 на 10^5 типа bool
Вообщем попробуй один bitset выделить в куче:
C++
1
std::auto_ptr<std::bitset<1000000000> > bits(new std::bitset<1000000000>);
если нет - то, видать, не судьба...
Avazart
Эксперт С++
7117 / 5294 / 273
Регистрация: 10.12.2010
Сообщений: 23,413
Записей в блоге: 17
13.03.2013, 02:54     Динамический массив с большим количеством элементов #20
Цитата Сообщение от ValeryS Посмотреть сообщение
если нет утечки и память не фрагментируется постоянными new delete то почему бы и нет
А если есть фрагментация ... + малое количество оперативки ...+ куча процессов жруших память
ValeryS
Модератор
6551 / 5017 / 463
Регистрация: 14.02.2011
Сообщений: 16,733
13.03.2013, 03:07     Динамический массив с большим количеством элементов #21
Цитата Сообщение от Avazart Посмотреть сообщение
А если есть фрагментация ... + малое количество оперативки ...+ куча процессов жруших память
А для этого у винды есть VirtualAlloc
да и думать нужно когда пишешь, а не бездумно память выделять удалять
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
13.03.2013, 03:12     Динамический массив с большим количеством элементов #22
Как будто VirualAlloc поможет от фрагментации, которая уже есть.
Avazart
Эксперт С++
7117 / 5294 / 273
Регистрация: 10.12.2010
Сообщений: 23,413
Записей в блоге: 17
13.03.2013, 03:19     Динамический массив с большим количеством элементов #23
Цитата Сообщение от ValeryS Посмотреть сообщение
да и думать нужно когда пишешь, а не бездумно память выделять удалять
Ну вот и я говорю... не известно что там ТС задумал...
luck
0 / 0 / 0
Регистрация: 06.07.2012
Сообщений: 63
13.03.2013, 03:25  [ТС]     Динамический массив с большим количеством элементов #24
Со статическими объявлениями понятно - одномерный массив работает нормально, двумерный даже не создается из-за размера. Динамические не срабатывают. В этой программе кроме этих случаев операций с памятью нету. Оперативки 16 гб. Завтра буду разбираться с битсет и вектором, но я так и не понял, почему может тупить с созданием динамического массива таких размеров.
ValeryS
Модератор
6551 / 5017 / 463
Регистрация: 14.02.2011
Сообщений: 16,733
13.03.2013, 03:25     Динамический массив с большим количеством элементов #25
Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
Как будто VirualAlloc поможет от фрагментации, которая уже есть.
конечно
резервируй в начале проги а не когда уже все загадил
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
13.03.2013, 03:27     Динамический массив с большим количеством элементов #26
Не, ну это-то понятно. Я про то, что она ни разу не поможет дефрагментировать кучу.

Выделить себе кусок с самого начала можно и без всяких VirtualAlloc (всё равно malloc() вызывает её при достаточно больших запросах памяти).
ValeryS
Модератор
6551 / 5017 / 463
Регистрация: 14.02.2011
Сообщений: 16,733
13.03.2013, 03:30     Динамический массив с большим количеством элементов #27
Цитата Сообщение от luck Посмотреть сообщение
Динамические не срабатывают. В этой программе кроме этих случаев операций с памятью нету. Оперативки 16 гб.
ты бы код скинул, а то так можно долго гадать

Добавлено через 1 минуту
Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
Я про то, что она ни разу не поможет дефрагментировать кучу.
а я даже не знаю кто, в рамках языка, поможет дефрагментировать память
luck
0 / 0 / 0
Регистрация: 06.07.2012
Сообщений: 63
13.03.2013, 03:31  [ТС]     Динамический массив с большим количеством элементов #28
Да я по-моему уже скидывал все части, относящиеся к выделению памяти.
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
#include <iostream>
#include <stdio.h>
#include <conio.h>
#include <string.h>
using namespace std;
unsigned long int func(unsigned long int);
//unsigned long int array[100000];
int main()
{
    unsigned long int i,j,num,res = 0;
    cin>>num; //Если num>45920, то ошибка
//    memset(array,0,100000);
    unsigned long int *arr = new unsigned long int[num];
    bool **mass = new bool*[num];
    for (i=0;i<num;i++)
        mass[i]= new bool[num];
    for (i=0;i<num;i++)
        for (j=0;j<num;j++)
            mass[i][j]=0;
    for (i=0;i<num;i++)
      scanf("%d",&arr[i]);
    for (i=0;i<num;i++)
     for (j=0;j<num;j++)
         if ((mass[j][i]==0) and (i!=j) )
                 if (func(arr[i])==func(arr[j]))
         {
                res++;
                mass[i][j]=1;
         }
    printf("%d",res);
    for (i=0;i<num;i++)
        delete[] mass[i];
    delete[] mass;
    delete[] arr;
    return 0;
}
 
unsigned long int func(unsigned long int a)
{
    if (a==0)
        return 0;
    if (a%2==0)
       return func(a/2);
    else
    {
         a=func(a/2)+1;
         return a;
    }
}
ValeryS
Модератор
6551 / 5017 / 463
Регистрация: 14.02.2011
Сообщений: 16,733
13.03.2013, 03:49     Динамический массив с большим количеством элементов #29
у меня на 1000000 нормально отработала
теперь несколько замечаний
Цитата Сообщение от luck Посмотреть сообщение
mass[i][j]=0;
для bool нет нуля есть true и false
следовательно вот это
Цитата Сообщение от luck Посмотреть сообщение
if ((mass[j][i]==0) and (i!=j) )
переписывается так
C++
1
if (!mass[j][i] && (i!=j) )
Цитата Сообщение от luck Посмотреть сообщение
for (i=0;i<num;i++)
* * * scanf("%d",&arr[i]);
Ты всерьез думаешь что пользователь будет с клавиатуры вгонять сто тысяч значений?
даже если по секунде на значения это 30 часов
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.03.2013, 03:52     Динамический массив с большим количеством элементов
Еще ссылки по теме:
Массив с неизвестным количеством элементов C++
Задан массив с количеством элементов n C++
Массив с неизвестным заранее количеством элементов C++
Строковый двумерный массив с произвольным количеством элементов C++
C++ Одномерный массив с неизвестным количеством элементов, написание ограничения

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

Или воспользуйтесь поиском по форуму:
luck
0 / 0 / 0
Регистрация: 06.07.2012
Сообщений: 63
13.03.2013, 03:52  [ТС]     Динамический массив с большим количеством элементов #30
олимпиадная задача, на том тесте, на котором я застрял из-за перебора памяти, было 56к значений)

На тестах проверки используется GCC 4.7, у меня Qt Creator - и там и там не сработало.
Yandex
Объявления
13.03.2013, 03:52     Динамический массив с большим количеством элементов
Ответ Создать тему
Опции темы

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