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

Контейнер hash_map - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Работа с файлами (подсчитать количество слов в файле, содержащих нечетное количеством букв) http://www.cyberforum.ru/cpp-beginners/thread903962.html
Первый раз работаю с файлами и тут у меня проблемы. После компиляции выводит неправильный ответ и выбивает: 'Lab 8.exe': Loaded 'D:\Projects\C++\Training\Lab 8\debug\Lab 8.exe', Binary was not built with debug information. 'Lab 8.exe': Loaded 'C:\WINDOWS\system32\ntdll.dll', No symbols loaded. 'Lab 8.exe': Loaded 'C:\WINDOWS\system32\kernel32.dll', No symbols loaded. The program ' Lab 8.exe:...
C++ ДИНАМИЧЕСКИЕ МАССИВЫ.Найти номер строки, в которой сумма отрицательных нечетных элементов самая большая не знаю почему не правильно считает ведь все правильно сделал?(( подскажите кто нибуть Пожалуста #include <iostream> #include <cmath> #include <cstdio> #include <cstdlib> #include <iomanip> using namespace std; int main() { int n, m, k; http://www.cyberforum.ru/cpp-beginners/thread903938.html
Как спростить код ? рекурсия (ввести последовательность чисел (окончание ввода - 0) и вывести их вобратной последовательности) C++
#include <iostream> using std::cout; using std::endl; using std::cin; const int n=100; int arr = {}; int i = 0; int count = 0;
C++ Дан массив. Выберите из него все элементы, которые встречаются в массиве наибольшее число раз
СРОЧНО!!! ПОМОГИТЕ ПОЖАЛУЙСТА,ОЧЕНЬ НУЖНО!!! ЗАРАНИЕ БЛАГОДАРЮ!) Дан*массив.*Выберите*из*него*все*элементы,*которые*встречаются*в*массиве*наибольшее*число*раз.
C++ В текстовом файле структура – информация о компьютерах. Структура с полями: название, стоимость. http://www.cyberforum.ru/cpp-beginners/thread903890.html
Ребят, помогите пожалуйста, 29 июня экзамен по "Основы программирования",кто сколько сможет сделать задач, тем всей группой поставим "+" пожалуйста:cry:, Заранее, СПАСИБО.... a)Требования: 1. Подготовить текстовый файл с входными данными в редакторе. 2. Составить алгоритм программы. 3. Выделить функции ввода, обработки и вывода. 4. Входные данные прочитать из файла. 5. Выполнить...
C++ Ввести с клавиатуры знак Зодиака. Найти в файле запись с таким знаком и вывести его Ребят, помогите пожалуйста, 29 июня экзамен по "Основы программирования",кто сколько сможет сделать задач, тем всей группой поставим "+" пожалуйста:cry:, Заранее, СПАСИБО.... a)Требования: 1. Подготовить текстовый файл с входными данными в редакторе. 2. Составить алгоритм программы. 3. Выделить функции ввода, обработки и вывода. 4. Входные данные прочитать из файла. 5. Выполнить... подробнее

Показать сообщение отдельно
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
19.06.2013, 12:14  [ТС]     Контейнер hash_map
От в общем кусочек шаблона который есть в книге, пытаюсь создать рабочий каркас, но он не работает, да и по шаблону много непоняток.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//klacc hash_map
#ifndef HASH_MAP
#define HASH_MAP
 
template<class Key,class T,class H=Hash<Key>,
    class EQ=equal_to<Key>,class A=allocator<pair<const Key,T> > >
class hash_map
{
    //как map за исключением
    typedef H Hasher;
    typedef EQ key_equal;
    //typedef int size_type;
    
    hash_map(const T& dv=T(),size_type n=101, const H& hf=H(), const EQ&=EQ() ){}
 
    template<class In>hash_map(In first, In last, const T& dv=T(), size_type n=101,
        const H& hf=H(), const EQ&=EQ()){}
 
};
 
#endif
size_type нету, что это такое? Я думаю наверно его нужно самому определить как int
typedef int size_type????
Когда так сделал ошибка на size_type пропала

Потом тут ошибка const H& hf=H(), const EQ&=EQ() в конструкторах. В чом ошибка? Что не создано шаблонов функций? или что? Походу видно, что конструктора вызываются так это получается классы тогда, а как же с этой фигней в начале шаблона быть с шапкой class H=Hash<Key> или class EQ=equal_to<Key>?

А от еще утета запись меня смущает class A=allocator<pair<const Key,T> >, что это такое? Здесь как стандартный шаблон используется или как? Пока я не дошол что бы тут ошибка вылезла в этой строке, но думаю вылезит, так как явно шаблон allocator и шаблон pair не подключены.

Я пока что хочу создать готовый каркас шаблон без нутрянки с пустыми функция, что бы хотя бы его заставить компилироваться, но ничего не получается .

Добавлено через 35 минут
От щас я полностью вес код что есть в книге набрал, правда он не компилируется, куча ошибок вылазит. Я его оформил в два файла от файл hash_map.h:
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
//klacc hash_map
#ifndef HASH_MAP
#define HASH_MAP
 
//делаем определение шаблона функции хеширования
template<class T> struct Hash : unary_function<T,size_t>
{
    size_t operator()(const T& key) const;
};
//определение функции хеширования она как то вызывается через operator()() хз. почему?
template<class T>size_t Hash<T>::operator()(const T& key)const
{
    size_t res=0;
    cout <<"mu v Hash"<<endl;exit(1);
    return res;
}
//несколько специализаций функции Hash
typedef char Pchar;
 
template<> size_t Hash<Pchar>::operator()(const Pchar& key)const
{
    size_t res=0;
    cout <<"mu v Hash<Pchar>"<<endl;exit(1);
    return res;
}
 
template<> size_t Hash<string>::operator()(const string& key)const
{
    size_t res=0;
    cout <<"mu v Hash<string>"<<endl;exit(1);
    return res;
}
//конец определения шаблона функции хеширования
 
 
//Начало класса hash_map
template<class Key,class T,class H=Hash<Key>,
    class EQ=equal_to<Key>,class A=allocator<pair<const Key,T> > >
class hash_map
{
    //как map за исключением
    typedef H Hasher;
    typedef EQ key_equal;
    typedef size_t size_type;//из функции Hash видно что size_t нужно, а не int
    
    hash_map(const T& dv=T(), size_type n=101, const H& hf=H(), const EQ&=EQ())
        :default_value(dv),b(n),no_of_erased(0),hash(h),eq(e)
    {
        set_load();//все что по умолчанию
        v.reserve(max_load*b.size());//резервирует память для роста
    }
 
    void set_load(float m=0.7,float g=1.6){max_load=m;grow=g;}
 
    template<class In>hash_map(In first, In last, const T& dv=T(), size_type n=101,
        const H& hf=H(), const EQ&=EQ()){}
 
    //Поиск
    mapped_type& operator[](const key_type& k);
 
    iterator find(const key_type&);
    const_iterator find(const key_type&) const;
    //...
 
    void resize(size_type n);//размер хэш таблицы в n
    
    void erase(iterator position);//удаление указуемого элемента
 
    size_type size() const {return v.size()-no_of_erased;}//число элементов
 
    size_type bucket_count() const {return b.size();}//размер хэш таблицы
 
    Hasher hash_fun() const {return hash;}//применяемая хэш функция
    key_equal key_eq() const {return eq;}//равенство
 
private://внутреннее представление
    float max_load;//сохраняем v.size()<=b.size()*max_load
    float grow;//при необходимости меняем размер, resize(bucket_count()* grow)
    size_type no_of_erased;//количество входов в v занятых стертыми элементами
    Hasher hash; //хэш функция
    key_equal eq;//равенство
 
    const T default_value;//умолчательное значение используется операцией []
 
    struct Entry
    {
        key_type key;
        moped_type val;
        bool erased;
 
        Entry* next; //следущий элемент или хз что
 
        Entry(key_type k, moped_type v, Entry* n)
            :key(k),val(v),next(n){}
    };
 
    vector<Entry> v;//истиные входы
    vector<Entry*> b;//хешь таблица указатели внутрь v
    //...
 
};
 
#endif
Файл hash_map.cpp:
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
//opredelenie hash_map
#include <iostream>
using std::cout;
using std::endl;
#include <cstdlib>
using std::exit;
 
template<class Key, class T, class H=Hash<Key>,
    class EQ=equal_to<Key>,class A=allocator<pair<const Key, T> > >
        typename hash_map<Key,T,H,EQ,A>::moped_type&
        hash_map<Key,T,H,EQ,A>::operator[](const key_type& k)
    {
        cout <<"mu v operator[]"<<end;exit(1);
 
        return b[0]->val;
    }
 
template<class Key,class T,class H=Hash<Key>,
    class EQ=equal_ty<Key>,class A=allocator<pair<const Key,T> > >
        void hash_map<Key,T,H,EQ,A>::resize(size_type s)
    {
        cout <<"resize"<<endl;exit(1);
    }
 
template<class Key,class T,class H=Hash<Key>,
    class EQ=equal_to<Key>,class A=allocator<pair<const Key,T> > >
        void hash_map<Key,T,H,EQ,A>::erase(iterator p)
    {
        if(p->erased==false) no_of_erased++;
        p->erased=true;
    }
и файл main.cpp:
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
using std::cout;
using std::endl;
 
#include "hash_map.h"
 
int main()
{
    cout <<"Test hash_map"<<endl;
 
    return 0;
}
Ту еще похоже нету структуры для сравнения EQ наверно она так же делается как и функция H хэш, так же структура создается и переопределяется operator()()?

Еще утета от строчка не ясна
template<class T> struct Hash : unary_function<T,size_t>
что такое unary_function<T, size_t>, что это за класс? Почему от нее наследуется struct Hash?

В общем код не компилируется, отето вам и рабочий пример кода из книги, фиг что работает.
В примере кода я логику из функций поубирал, чтобы не мешало разбирать шаблон, Оно и так должно работать без нутрянки, Как оказалось шаблон разобрать очень сложно, одни ошибки.

Добавлено через 5 минут
От при компиляции сразу первая ошибка вылезла в этой строке: template<class T> struct Hash : unary_function<T,size_t>
понятно что не понятно что такое за фигня unary_function<T,size_t> ????????????? Да в примере есть, а что это такое, его определения нету, я от предполагаю мб это функция из СТЛ, Там то написано что struct Hash - это класс функциональных объекто или он создан в виде функционального объекта, от и думаю мб unary_function это какое то средство стандартное для создания функциональных объектов???????

Добавлено через 2 минуты
Кто делал хелп, это ж одна из популярных задач по С++, Хорошо б еслиб кто нить скинул код уже готового отлаженого примера

Добавлено через 15 минут
Еще в этой строке ошибка mopped_type& operator[](const key_type& k);
Отут когда я типы mopped_type и key_type меняю на int, то ошибки нету, видно что типы не определены, как мне их определить? typedef Key key_type; это вроде как бы ясно, а от mopped_type Что это будет? это наверно T ??? хз. Запутанная такая фигня.

Добавлено через 3 минуты
От теперь ошибка в этой строчке iterator find(const key_type&);
Как мне iterator определить? Что это будет указатель на Т* или указатель на ключ? хз.

Добавлено через 1 минуту
Отето вам и пример из книги, просто куски набрасали, которые в куче ничего не работают ппц. Все самому доделыввай, догадывайся.

Добавлено через 3 минуты
Класс должен получится такой же как std::map, по функционалу и красиво оформлен
Давайте активней! Активней! Шнеля! Шнеля!

Добавлено через 1 минуту
Меня эти typedefы не сильно волнуют, больше волнует новое понятие "функциональные объекты", что это?
 
Текущее время: 07:16. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru