Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

13.03.2013, 00:15. Просмотров 3523. Ответов 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]; сразу выводят ошибку, причем в обоих случая изменение типа элементов массива ничего не меняет.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.03.2013, 00:15
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Динамический массив с большим количеством элементов (C++):

Создать с помощью new динамический массив с указанным количеством элементов - C++
Так как пока что я учусь самостоятельно у меня нету проверяющего, поэтому прошу вас посмотреть все ли правильно я делаю. Задание:...

Применение массивов случайных чисел с большим количеством элементов - C++
Само задание: Создайте две функции для решения одной и той же задачи: динамическое создание и заполнение случайными числами массива...

Реализовать обработку и файловую запись/чтение массива с большим количеством элементов - C++
такую задачу поставили... имеется 600 000 элементов. Каждому элементу присвоить значение и по 300 000 записать в файл. массив такое...

Строки матрицы, с большим количеством положительных элементов расположить выше остальных - C++
В массиве А(N,M) расположить строки так, чтобы сначала шли строки, у которых положительных элементов больше, чем отрицательных, затем с...

Удалить строку с самым большим количеством слов - C++
помогите написать программу: "Удалить строку с самым большим количеством слов" (используя указатели) С++ Заранее...

Алгоритм быстрой сортировки не работает с большим количеством чисел - C++
Требовалось написать программу с алгоритмами сортировки, затем сравнить эти алгоритмы (но проблема не в этом). Все работает, кроме быстрой...

61
Avazart
Эксперт С++
7586 / 5571 / 330
Регистрация: 10.12.2010
Сообщений: 24,996
Записей в блоге: 17
13.03.2013, 02:50 #16
Цитата Сообщение от ValeryS Посмотреть сообщение
unsigned long long* tst1=new unsigned long long[1000000];
Это может работать от случая к случаю...
0
OhMyGodSoLong
~ Эврика! ~
1245 / 994 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
13.03.2013, 02:51 #17
Почему? 8 мегабайт — это я не знаю, как надо усиленно загадить кучу перед этим, чтобы оно работало от случая к случаю.
0
ValeryS
Модератор
7020 / 5358 / 531
Регистрация: 14.02.2011
Сообщений: 18,074
13.03.2013, 02:51 #18
Цитата Сообщение от Avazart Посмотреть сообщение
Это будет работать от случая к случаю...
если нет утечки и память не фрагментируется постоянными new delete то почему бы и нет
0
gray_fox
What a waste!
1552 / 1257 / 74
Регистрация: 21.04.2012
Сообщений: 2,634
Завершенные тесты: 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>);
если нет - то, видать, не судьба...
0
Avazart
Эксперт С++
7586 / 5571 / 330
Регистрация: 10.12.2010
Сообщений: 24,996
Записей в блоге: 17
13.03.2013, 02:54 #20
Цитата Сообщение от ValeryS Посмотреть сообщение
если нет утечки и память не фрагментируется постоянными new delete то почему бы и нет
А если есть фрагментация ... + малое количество оперативки ...+ куча процессов жруших память
0
ValeryS
Модератор
7020 / 5358 / 531
Регистрация: 14.02.2011
Сообщений: 18,074
13.03.2013, 03:07 #21
Цитата Сообщение от Avazart Посмотреть сообщение
А если есть фрагментация ... + малое количество оперативки ...+ куча процессов жруших память
А для этого у винды есть VirtualAlloc
да и думать нужно когда пишешь, а не бездумно память выделять удалять
0
OhMyGodSoLong
~ Эврика! ~
1245 / 994 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
13.03.2013, 03:12 #22
Как будто VirualAlloc поможет от фрагментации, которая уже есть.
0
Avazart
Эксперт С++
7586 / 5571 / 330
Регистрация: 10.12.2010
Сообщений: 24,996
Записей в блоге: 17
13.03.2013, 03:19 #23
Цитата Сообщение от ValeryS Посмотреть сообщение
да и думать нужно когда пишешь, а не бездумно память выделять удалять
Ну вот и я говорю... не известно что там ТС задумал...
0
luck
0 / 0 / 0
Регистрация: 06.07.2012
Сообщений: 63
13.03.2013, 03:25  [ТС] #24
Со статическими объявлениями понятно - одномерный массив работает нормально, двумерный даже не создается из-за размера. Динамические не срабатывают. В этой программе кроме этих случаев операций с памятью нету. Оперативки 16 гб. Завтра буду разбираться с битсет и вектором, но я так и не понял, почему может тупить с созданием динамического массива таких размеров.
0
ValeryS
Модератор
7020 / 5358 / 531
Регистрация: 14.02.2011
Сообщений: 18,074
13.03.2013, 03:25 #25
Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
Как будто VirualAlloc поможет от фрагментации, которая уже есть.
конечно
резервируй в начале проги а не когда уже все загадил
0
OhMyGodSoLong
~ Эврика! ~
1245 / 994 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
13.03.2013, 03:27 #26
Не, ну это-то понятно. Я про то, что она ни разу не поможет дефрагментировать кучу.

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

Добавлено через 1 минуту
Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
Я про то, что она ни разу не поможет дефрагментировать кучу.
а я даже не знаю кто, в рамках языка, поможет дефрагментировать память
0
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;
    }
}
0
ValeryS
Модератор
7020 / 5358 / 531
Регистрация: 14.02.2011
Сообщений: 18,074
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 часов
0
luck
0 / 0 / 0
Регистрация: 06.07.2012
Сообщений: 63
13.03.2013, 03:52  [ТС] #30
олимпиадная задача, на том тесте, на котором я застрял из-за перебора памяти, было 56к значений)

На тестах проверки используется GCC 4.7, у меня Qt Creator - и там и там не сработало.
0
13.03.2013, 03:52
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.03.2013, 03:52
Привет! Вот еще темы с ответами:

Определить номер строки матрицы с наиболее большим количеством нулей - C++
с помощью датчика случайных чисел заполнить двоичную матрицу 5 10. определить номер строки с наиболее большим количеством нулей

Задан массив с количеством элементов n - C++
Задан массив с количеством элементов n.Сформировать 2 массива:в 1 включить элементы исходного массива с чётными номерами,а во 2 с нечётными

Массив с неизвестным количеством элементов - C++
Как задать char массив, количество элементов которого мне неизвестно? Туда может быть записано 10 элементов, а может и 25 или еще больше. ...

Как преобразовать массив в динамический? Массив вычисляет сумму элементов каждой диагонали матрицы - C++
Ошибка : Вызвано исключение по адресу 0x00BB2F4F в Проект6.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0xFDFDFE05. #...


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

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Опции темы

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