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

Ассоц. массив - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ разреженная матрица http://www.cyberforum.ru/cpp-beginners/thread262090.html
Помогите, пожалуйста, с задачей:Дана разряженная матрицы общего вида. Осуществить циклический сдвиг в матрице каждого столбца на n разрядов. У меня есть программа, где сдвиг каждой строки на n...
C++ Определить, принадлежит ли точка заданной области и вывести ответ. ...... http://www.cyberforum.ru/cpp-beginners/thread262088.html
C++ Работа с символьными данными
Помогите плз!!!!! ваще идей нет((((( Вывести на печать список слов, имеющих приставку (несколько букв), задаваемую с терминала.
C++ Динамичный массив на C++
Заменить наименьшие элементы в массиве на среднее арифметическое его значений. Создать функции для вычисления среднего арифметического элементов массива и определения его минимума....
C++ дамп, маскирование, функции http://www.cyberforum.ru/cpp-beginners/thread262062.html
//dump for a short integer #include <iostream> short int dva(short int number) { using namespace std; bool flag(false); if (number) {
C++ Ошибка 6 error C2664: strtok: невозможно преобразовать параметр 1 из "const char *" в "char *" string s = "555 44 55 66";//размер строки заранее неизвестен char* p = strtok(s.c_str(), ' '); не нравится такое компилятору. пишет Ошибка 6 error C2664: strtok:... подробнее

Показать сообщение отдельно
ForEveR
В астрале
Эксперт С++
7978 / 4737 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
23.03.2011, 03:01
Лови. Писал по заказу - осталось. На базе массива пар.

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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
#include <utility>
#include <string>
#include <iostream>
 
//Если не будет компилироваться - убрать все вхождения std.
template<class Value>
class Map
{
    //typedef-ы для удобства. Псевдонимы для типов.
    typedef std::string _Key;
    typedef Value _Val;
    typedef std::pair<_Key, _Val> _Ty;
public:
    //Конструктор по умолчанию. Размер - ноль, массив - ноль.
    Map():sz(0)
    {
        Array=0;
    }
    //Констр с параметром. Инициализируем массив и выделяем память под sz_ элементов.
    Map(size_t sz_):sz(sz_)
    {
        Array=new _Ty[sz_];
    }
    //Конструктор копирования
    Map(const Map& other)
    {
        //Выделяем память.
        Array=new _Ty[other.sz];
        sz=other.sz;
        //Копируем элементы.
        for(size_t i=0; i<sz; ++i)
        {
            Array[i]=other.Array[i];
        }
    }
    //Деструктор. Удаляем.
    ~Map()
    {
        delete[] Array;
    }
    //Оператор присваивания
    Map& operator =(const Map& other)
    {
        //Если объекту присваивается он же сам
        if(this == &other)
            //Возвращаем объект
            return *this;
        //Чистим память.
        delete[] Array;
        //Выделяем память, меняем размер, копируем элементы.
        Array=new _Ty[other.sz];
        sz=other.sz;
        for(size_t i=0; i<sz; ++i)
            Array[i]=other.Array[i];
        //Возвращаем измененный объект.
        return *this;
    }
    //Очистка. Размер ставим нулевым. Массиву ставим указатель на ноль.
    void clear()
    {
        sz=0;
        Array=0;
    }
    //Вставка элемента в конец.
    void insert(const _Ty& one)
    {
        //Временный массив.
        _Ty* TmpArray;
        //Выделяем память на 1 больше чем в массиве сейчас.
        TmpArray=new _Ty[sz+1];
        //Копируем элементы из нашего массива во временный.
        for(size_t i=0; i<sz; ++i)
            TmpArray[i]=Array[i];
        //Добавляем в конец временного элемент.
        TmpArray[sz]=one;
        //Очищаем память.
        delete[] Array;
        //Присваиваем указатели. Итого Array теперь указывает на
        //первый элемент TmpArray.
        Array=TmpArray;
        ++sz;
    }
    //Удаление элемента по ключу.
    //Возвращает true, если удалили, false, если элемента нет.
    bool erase(const _Key& one)
    {
        //Если размер нулевой вызываем функцию, кидающую исключение.
        if(sz == 0)
            Empty_Error();
        //Циклом по всему нашему массиву
        for(size_t i=0; i<sz; ++i)
        {
            //Если ключ элемента совпадает с нужным ключом
            if(Array[i].first == one)
            {
                //Создаем временный массив размером на 1 элемент меньше
                //И копируем туда старый, за исключением нужного ключа.
                _Ty* Tmp=new _Ty[sz-1];
                int k=0;
                for(size_t j=0; j<sz; ++j)
                {
                    if(Array[j].first == one)
                        continue;
                    Tmp[k]=Array[j];
                    ++k;
                }
                //Очищаем память.
                delete[] Array;
                //Теперь указывает на начало Tmp.
                Array=Tmp;
                sz-=1;
                return true;
            }
        }
        //Если не найдено - возвращаем false.
        return false;
    }
    //Поиск элемента.
    _Val find(const _Key& one)
    {
        //Если пустой кидаем искл.
        if(sz == 0)
            Empty_Error();
        //Ищем по ключу - если нашли возвращаем значение.
        for(size_t i=0; i<sz; ++i)
            if(Array[i].first == one)
                return Array[i].second;
        //Если не нашли возвращаем пустую строку.
        return _Val();
    }
    //Оператор доступа.
    _Val& operator [](const _Key& one)
    {
        //Если есть ключ вертаем значение.
        for(size_t i=0; i<sz; ++i)
            if(Array[i].first == one)
                return Array[i].second;
        //Если нет - создаем пару ключ - значение,
        //где значение устанавливается конструктором по умолчанию для типа
        //в нашем случае "".
        insert(std::make_pair(one, _Val()));
        //Вертаем значение.
        return Array[sz-1].second;
    }
    //Доступ к размеру массива.
    size_t size() const
    {
        return sz;
    }
    //Вывод на экран.
    void print()
    {
        for(size_t i=0; i<sz; ++i)
            std::cout<<Array[i].first<<' '<<Array[i].second<<'\n';
    }
    //Пустой-ли массив, проверяем просто проверяя размер на равенство нулю.
    bool empty()
    {
        return sz == 0;
    }
private:
    //Сам массив.
    _Ty* Array;
    //Размер.
    size_t sz;
    //Функция ошибки.
    void Empty_Error()
    {
        //Если работаем в DEBUG режиме - кидаем дебаг ошибку.
#if _DEBUG
        {
            std::_DEBUG_ERROR("Array is empty");
        }
        //Если релиз - кидаем исключение.
#else
        throw std::runtime_error("Array is empty");
        //Каждый #if, #ifdef, #ifndef 
        //должен иметь парный #endif
#endif
    }
};
1
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru