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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
xapiton
0 / 0 / 0
Регистрация: 26.02.2010
Сообщений: 14
27.01.2011, 10:19     Класс для работы с большими данными #1
Задали задание, написать класс который позволит работать с большими массивами, т.е. конструктор класса должен позволять создавать массив нужного (любого размера). Класс должен быть шаблонным. Должен уметь добавлять элементы в созданный массив. Получение доступа к элементам массива через индекс. Получение длины массива. Удаление текущего массива. И деструктор класса должен освобождать всю память.
Вот что у меня получилось :

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] ) тоже не выходит.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
27.01.2011, 10:30     Класс для работы с большими данными #2
Цитата Сообщение от xapiton Посмотреть сообщение
А вот с определением длины выделяемой памяти не получается и с получением доступа через индекс ( наверно так надо [index] ) тоже не выходит.
Для доступа по индексу нужно перегружать оператор
C++
1
Type& operator[] (size_t index);
А вот зачем определять длину выделяемой памяти, мне непонятно. Функции работы с памятью самописные? И почему бы не использовать более подходящие delete, new?
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 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;
}
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/libr...87(VS.85).aspx
Я честно не совсем понимаю в чем разница между delete, new и VirtualAlloc, VirtualFree. Вижу только разницу в том что учили мы delete, new в курсе С++, а VirtualAlloc, VirtualFree учим в курсе Visual C++ WinAPI.
Прошу прощенья если я чего сразу не уточнил.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
27.01.2011, 11:12     Класс для работы с большими данными #5
xapiton, во всяком случае, гляньте мой код. Я показал, как перегружать оператор [].
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
27.01.2011, 11:14     Класс для работы с большими данными #6
Цитата Сообщение от xapiton Посмотреть сообщение
Как это самописные ??? функции из <windows.h> для работы с виртуальной памятью.
Я не знал, поэтому и спросил.
Цитата Сообщение от xapiton Посмотреть сообщение
Я честно не совсем понимаю в чем разница между delete, new и VirtualAlloc, VirtualFree
Ну, очевидно, в другом способе распределения этой самой памяти.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
27.01.2011, 11:30     Класс для работы с большими данными #7
На сколько массив большой? Все ли его элемент должны реально присутствовать в физическом массиве? Индексы могут быть от 0 до FFFFFFFF тогда логический массив имеет 100000000 элементов, но из них могут быть реально нужны 100, или даже 10. Зачем хранить остальные? Если только нужные элементы и хранить, то физический массив будет из 100 или 10 элементов. В твоём случае можно так поступить? Какую долю логического массива должен занимать физический? Каково распределение физических элементов по логическому массиву?
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 ?????
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
27.01.2011, 12:46     Класс для работы с большими данными #9
xapiton, если ты выделяешь массив размером 4096 байт, то ты можешь в него положить 4096 / sizeof(int) элементов типа int.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
27.01.2011, 13:51     Класс для работы с большими данными #10
Цитата Сообщение от xapiton Посмотреть сообщение
выделять виртуальную память.
Виртуальную? То есть куски файла подкачки?

Добавлено через 1 минуту
Цитата Сообщение от xapiton Посмотреть сообщение
4096 байт то туда я могу положить только 2048 переменных типа int
short int можно, long int не влезет.
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
27.01.2011, 13:53     Класс для работы с большими данными #11
Цитата Сообщение от taras atavin Посмотреть сообщение
short int можно, long int не влезет.
а разве есть гарантия, что short int = 2 байта?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.01.2011, 14:15     Класс для работы с большими данными
Еще ссылки по теме:

C++ Класс С++ для работы с треугольником
C++ Порекомендуйте библиотеку для работы с большими числами
Есть ли библиотеки для работы с большими числами C++

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

Или воспользуйтесь поиском по форуму:
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
27.01.2011, 14:15     Класс для работы с большими данными #12
Нет, но в тридцатидвухбитных системах он не может быть больше, значит влезет.
Yandex
Объявления
27.01.2011, 14:15     Класс для работы с большими данными
Ответ Создать тему
Опции темы

Текущее время: 00:46. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru