Форум программистов, компьютерный форум 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
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
20.06.2013, 11:59  [ТС]     Контейнер hash_map
Здорова!
Снова вылезла непонятная ошибка
От файл 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
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
//opredelenie hash_map
 
#include "hash_map.h"
 
#include <iostream>
using std::cout;
using std::endl;
#include <cstdlib>
using std::exit;
 
//несколько специализаций функции Hash
template<class T>size_t Hash<T>::operator()(const T& key)const
{
    size_t res=1;
    cout <<"mu v Hash"<<endl;exit(1);
    return res;
}
 
typedef char Pchar; //char как тип Pchar
template<> size_t Hash<Pchar>::operator()(const Pchar& key)const
{
    size_t res=2;
    cout <<"mu v Hash<Pchar>"<<endl;exit(1);
    return res;
}
 
template<> size_t Hash<string>::operator()(const string& key)const
{
    size_t res=3;
    cout <<"mu v Hash<string>"<<endl;exit(1);
    return res;
}
//конец специализации функции хеширования
 
template<class Key,class T,class H,
    class EQ,class A>
        typename hash_map<Key,T,H,EQ,A>::mopped_type&
        hash_map<Key,T,H,EQ,A>::operator[](const key_type& k)
    {
        cout <<"mu v operator[]"<<endl;exit(1);
 
        return b[0]->val;
    }
 
template<class Key, class T, class H,
    class EQ,class A >
        void hash_map<Key,T,H,EQ,A>::resize(size_type s)
    {
        cout <<"resize"<<endl;exit(1);
    }
 
template<class Key, class T, class H,
    class EQ,class A >
        void hash_map<Key,T,H,EQ,A>::erase(iterator p)
    {
        if(p->erased==false) no_of_erased++;
        p->erased=true;
    }
Файл 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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
//klacc hash_map
#ifndef HASH_MAP
#define HASH_MAP
 
#include <string>
using std::string;
#include <vector>
using std::vector;
#include <iostream>
using std::cout;
using std::endl;
#include <cstdlib>
using std::exit;
#include <functional>
using std::unary_function;
#include <allocators>
using std::allocator;
#include <utility>
using std::pair;
 
 
//делаем определение шаблона функции хеширования
template<class T> struct Hash : unary_function<T,size_t>
{
    size_t operator()(const T& key) const;
    
};
 
//делаем шаблон функции сравнения
template<class T> struct equal_to : unary_function<T,size_t>
{
    size_t operator()(const T& key) const;
};
//определение функции хеширования она как то вызывается через operator()() хз. почему?
template<class T>size_t equal_to<T>::operator()(const T& key)const
{
    size_t res=0;
    cout <<"mu v Hash"<<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
{
public:
    //как map за исключением
    typedef H Hasher;
    typedef EQ key_equal;
    typedef size_t size_type;//из функции Hash видно что size_t нужно, а не int
    typedef Key key_type;
    typedef T mopped_type;
    typedef T* iterator;
    typedef const T* const_iterator;
    
    
    hash_map(const T& dv=T(), size_type n=101, const H& hf=H(), const EQ& e=EQ())
        :default_value(dv),b(n),no_of_erased(0),hash(hf),eq(e)
    {
        set_load();//все что по умолчанию
        v.reserve(max_load*b.size());//резервирует память для роста
        cout <<v.size()<<' '<<b.size()<<endl;
    }
 
    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()){}
 
    //Поиск
    mopped_type& operator[](const key_type& k);//{cout <<"mu tyt"<<endl; return b[0]->val;}
 
    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;
        mopped_type val;
        bool erased;
 
        Entry* next; //следущий элемент или хз что
 
        Entry(key_type k, mopped_type v, Entry* n)
            :key(k),val(v),next(n){}
    };
 
    vector<Entry> v;//истиные входы
    vector<Entry*> b;//хешь таблица указатели внутрь v
    //...
 
};
 
//определения функци
 
 
#endif
и main.cpp:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
using std::cout;
using std::endl;
#include <cstdlib>
using std::exit;
#include <string>
using std::string;
 
#include "hash_map.h"
 
int main()
{
    cout <<"Test hash_map"<<endl;
 
    hash_map<string, int> h;
    h["hellow"]=4;
 
    return 0;
}
при вызове operator[]() происходит ошибка:Создание кода...
1>main.obj : error LNK2019: ссылка на неразрешенный внешний символ "public: int & __thiscall hash_map<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,int,struct Hash<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >,struct equal_to<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >,class std::allocator<struct std:air<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const ,int> > >::operator[](class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" (??A?$hash_map@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@HU?$Hash@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@@U?$equal_to@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@H@std@@@2@@@QAEAAHABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z) в функции _main
1>C:\test\test\Debug\test.exe : fatal error LNK1120: 1 неразрешенных внешних элементов
========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========


Если я закомментирую определение функции operator[] в файле hash_map.cpp и определю ее в классе hash_map то этой ошибки нету. Наверно как то шаблон функции operator[]() ее определение как то не правильно определено?????
 
Текущее время: 01:30. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru