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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
xapiton
0 / 0 / 0
Регистрация: 26.02.2010
Сообщений: 14
#1

Класс для работы с большими данными - C++

27.01.2011, 10:19. Просмотров 1263. Ответов 11
Метки нет (Все метки)

Задали задание, написать класс который позволит работать с большими массивами, т.е. конструктор класса должен позволять создавать массив нужного (любого размера). Класс должен быть шаблонным. Должен уметь добавлять элементы в созданный массив. Получение доступа к элементам массива через индекс. Получение длины массива. Удаление текущего массива. И деструктор класса должен освобождать всю память.
Вот что у меня получилось :

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
template <typename Type> class CLargeData
{
private:
    Type* m_ptr;
    int m_size;
public:
    void Display()
    {
        for( int i = 0; i < m_size; i++ )
        {
            cout << m_ptr[ i ];
        }
        cout << endl;
    }
    Type* Pop( int pos )
    {
        Type* ptr = &m_ptr[ pos ];
        return ptr;
    }
    void Push( Type* var, int pos )
    {
        int i = 0;
        while( var[ i ] != NULL )
        {
            m_ptr[ pos ] = var[ i ];
            i++;
            pos++;
        }
    }
    CLargeData ( int size ) 
    {
        m_size = size;
        m_ptr = (Type*) VirtualAlloc( 0, m_size, MEM_COMMIT, PAGE_READWRITE );
        cout << "constr" << endl;
    }
    ~CLargeData () 
    {
        VirtualFree( m_ptr, m_size, MEM_RELEASE );
        cout << "destr" << endl;
 
    }
};
А вот с определением длины выделяемой памяти не получается и с получением доступа через индекс ( наверно так надо [index] ) тоже не выходит.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.01.2011, 10:19
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Класс для работы с большими данными (C++):

Класс для работы с большими числами - C++
Здравствуйте, кто-нибудь уже писал класс для работы с очень большими числами, с поддержкой операторов +-/*, если да то дайте, пожалуйста,...

Класс "одномерный массив" и методы для работы с его данными - C++
Описать класс одномерный массив, содержащий его элементы и их количество, а так же методы: вывода всех значений на экран, нахождения...

Порекомендуйте библиотеку для работы с большими числами - C++
Добрый день. Нужна библиотека для работы с большими числами, в которой определены следующие операции: умножение, деление, разность, сумма,...

Есть ли библиотеки для работы с большими числами - C++
Доброй ночи! Какие вы могли бы порекомендовать библиотеки для работы с большими числами в языке C/C++?

Простой калькулятор для работы с большими числами - C++
Помогите плеас) Задали сделать простенький калькулятор-сделал. Сказали, что нужно для работы с большими числами переделать. Изменил тип...

Библиотека для работы с большими числами, возможность факторизации - C++
Привет всем! Какие библиотеки можете посоветовать для работы с большими числами, с возможностью их факторизации. Хотелось бы иметь...

11
Nameless One
Эксперт С++
5775 / 3425 / 255
Регистрация: 08.02.2010
Сообщений: 7,448
27.01.2011, 10:30 #2
Цитата Сообщение от xapiton Посмотреть сообщение
А вот с определением длины выделяемой памяти не получается и с получением доступа через индекс ( наверно так надо [index] ) тоже не выходит.
Для доступа по индексу нужно перегружать оператор
C++
1
Type& operator[] (size_t index);
А вот зачем определять длину выделяемой памяти, мне непонятно. Функции работы с памятью самописные? И почему бы не использовать более подходящие delete, new?
0
silent_1991
Эксперт С++
4987 / 3044 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
27.01.2011, 10:34 #3
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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include <iostream>
 
template< typename T >
class Array
{
public:
    Array(size_t = 1);
    ~Array();
 
    size_t size() const;
 
    T &operator[](size_t);
    const T &operator[](size_t) const;
 
private:
    T *_array;
    size_t _size;
};
 
template< typename T >
Array< T >::Array(size_t size):
_size(size),
_array(new T [size])
{
}
 
template< typename T >
Array< T >::~Array()
{
    delete [] _array;
}
 
template< typename T >
size_t Array< T >::size() const
{
    return _size;
}
 
template< typename T >
T &Array< T >::operator[](size_t index)
{
    return _array[index];
}
 
template< typename T >
const T &Array< T >::operator[](size_t index) const
{
    return _array[index];
}
 
int main()
{
    Array< int > arr(20);
 
    for (int i = 0; i < 20; ++i)
        arr[i] = i;
 
    for (int i = 0; i < 20; ++i)
        std::cout << arr[i] << "  ";
 
    std::cout << std::endl << arr.size() << std::endl;
 
    return 0;
}
0
xapiton
0 / 0 / 0
Регистрация: 26.02.2010
Сообщений: 14
27.01.2011, 11:08  [ТС] #4
Цитата Сообщение от Nameless One Посмотреть сообщение
А вот зачем определять длину выделяемой памяти, мне непонятно.
ну такое задали, может в след. уроке пригодиться.
Цитата Сообщение от Nameless One Посмотреть сообщение
Функции работы с памятью самописные? И почему бы не использовать более подходящие delete, new?
Как это самописные ??? функции из <windows.h> для работы с виртуальной памятью. У нас тема урока такая "Семейство функций Virtual*." - http://msdn.microsoft.com/en-us/library/aa366887(VS.85).aspx
Я честно не совсем понимаю в чем разница между delete, new и VirtualAlloc, VirtualFree. Вижу только разницу в том что учили мы delete, new в курсе С++, а VirtualAlloc, VirtualFree учим в курсе Visual C++ WinAPI.
Прошу прощенья если я чего сразу не уточнил.
0
silent_1991
Эксперт С++
4987 / 3044 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
27.01.2011, 11:12 #5
xapiton, во всяком случае, гляньте мой код. Я показал, как перегружать оператор [].
1
Nameless One
Эксперт С++
5775 / 3425 / 255
Регистрация: 08.02.2010
Сообщений: 7,448
27.01.2011, 11:14 #6
Цитата Сообщение от xapiton Посмотреть сообщение
Как это самописные ??? функции из <windows.h> для работы с виртуальной памятью.
Я не знал, поэтому и спросил.
Цитата Сообщение от xapiton Посмотреть сообщение
Я честно не совсем понимаю в чем разница между delete, new и VirtualAlloc, VirtualFree
Ну, очевидно, в другом способе распределения этой самой памяти.
0
taras atavin
3570 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
27.01.2011, 11:30 #7
На сколько массив большой? Все ли его элемент должны реально присутствовать в физическом массиве? Индексы могут быть от 0 до FFFFFFFF тогда логический массив имеет 100000000 элементов, но из них могут быть реально нужны 100, или даже 10. Зачем хранить остальные? Если только нужные элементы и хранить, то физический массив будет из 100 или 10 элементов. В твоём случае можно так поступить? Какую долю логического массива должен занимать физический? Каково распределение физических элементов по логическому массиву?
0
xapiton
0 / 0 / 0
Регистрация: 26.02.2010
Сообщений: 14
27.01.2011, 12:43  [ТС] #8
Цитата Сообщение от taras atavin Посмотреть сообщение
На сколько массив большой? Все ли его элемент должны реально присутствовать в физическом массиве? Индексы могут быть от 0 до FFFFFFFF тогда логический массив имеет 100000000 элементов, но из них могут быть реально нужны 100, или даже 10. Зачем хранить остальные? Если только нужные элементы и хранить, то физический массив будет из 100 или 10 элементов. В твоём случае можно так поступить? Какую долю логического массива должен занимать физический? Каково распределение физических элементов по логическому массиву?
Затрудняюсь ответить на ваши вопросы. Нужен просто класс. В учебных целях наверно просто научиться выделять виртуальную память. Может дальше еще расскажут что с этим делать.
--------------------------------------------------------
а еще вопрос. если я выделяю память (массив?) размером 4096 байт то туда я могу положить только 2048 переменных типа int ?????
0
Nameless One
Эксперт С++
5775 / 3425 / 255
Регистрация: 08.02.2010
Сообщений: 7,448
27.01.2011, 12:46 #9
xapiton, если ты выделяешь массив размером 4096 байт, то ты можешь в него положить 4096 / sizeof(int) элементов типа int.
1
taras atavin
3570 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
27.01.2011, 13:51 #10
Цитата Сообщение от xapiton Посмотреть сообщение
выделять виртуальную память.
Виртуальную? То есть куски файла подкачки?

Добавлено через 1 минуту
Цитата Сообщение от xapiton Посмотреть сообщение
4096 байт то туда я могу положить только 2048 переменных типа int
short int можно, long int не влезет.
0
Nameless One
Эксперт С++
5775 / 3425 / 255
Регистрация: 08.02.2010
Сообщений: 7,448
27.01.2011, 13:53 #11
Цитата Сообщение от taras atavin Посмотреть сообщение
short int можно, long int не влезет.
а разве есть гарантия, что short int = 2 байта?
0
taras atavin
3570 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
27.01.2011, 14:15 #12
Нет, но в тридцатидвухбитных системах он не может быть больше, значит влезет.
0
27.01.2011, 14:15
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.01.2011, 14:15
Привет! Вот еще темы с ответами:

Какой тип данных использовать для работы с большими числами? - C++
Здравствуйте! Какой тип данных можно использовать для больших чисел( unsigned long long не получается)?

Класс: создать класс Fraction для работы с дробными числами - C++
Необходимо создать класс Fraction для работы с дробными числами. Число должно быть представлено двумя полями: целая часть – длинное целое...

Создать базовый класс - Array и производный класс - Money для работы денежной суммы - C++
ПОМОГИТЕ, ПОЖАЛУЙСТА, С ЗАДАЧЕЙ Создать базовый класс - Array и производный класс - Money для работы денежной суммы

Способы работы с очень большими числами - C++
Здравствуйте, есть необходимость работать с числами выше 100000000000 но Visual Studio уже начинает выкабеливаться и выдавать данные &quot;в...


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

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

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