С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 15.05.2012
Сообщений: 200
1

хеш-функция

05.06.2020, 14:12. Показов 737. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Что-то я не могу понять, чего не хватает. Хешер на 34 строке.
Такие ошибки:
1)no match for call to '(const DomainHasher) (const Domain&)'
noexcept(declval<const _Hash&>()(declval<const _Key&>()))>

2)'value' is not a member of 'std::__and_<std::__is_fast_hash<DomainHasher>, std::__detail::__is_noexcept_hash<Domain, DomainHasher> >'
: public __bool_constant<!bool(_Pp::value)>

3)'value' is not a member of 'std::__not_<std::__and_<std::__is_fast_hash<DomainHasher>, std::__detail::__is_noexcept_hash<Domain, DomainHasher> > >'
typedef __uset_hashtable<_Value, _Hash, _Pred, _Alloc> _Hashtable;

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
#include <algorithm>
#include <iostream>
#include <string>
#include <string_view>
#include <unordered_set>
#include <vector>
 
using namespace std;
 
struct DomainHasher;
 
struct Domain {
public:
    string current;
    unordered_set<Domain, DomainHasher> next;
    bool cancel;
 
    bool operator==(const Domain& rhs)
    {
        return current == rhs.current;
    }
 
    bool operator==(const string& rhs)
    {
        return current == rhs;
    }
 
    bool operator==(const string_view& rhs)
    {
        return current == rhs;
    }
};
 
struct DomainHasher {
    size_t operator()(const Domain& d) const
    {
        const hash<string> shash;
        return shash(d.current);
    }
};
 
class ForbiddenDomains {
public:
    void AddDomain(const string& domain)
    {
        auto parseDomain = Parse(domain);
    }
    bool CheckDomain(const string& domain) const;
    void PrintAnswer(const bool answer, ostream& out = cout) const
    {
        if (answer)
            out << "Bad\n";
        else
            out << "Good\n";
    }
 
private:
    unordered_set<Domain, DomainHasher> data;
 
    vector<string_view> Parse(const string& domain)
    {
        string_view s { domain };
        vector<string_view> parseDomain;
        while (!s.empty()) {
            auto dot = s.find('.');
            parseDomain.push_back(s.substr(0, dot));
            s.remove_prefix(dot + 1);
        }
        return parseDomain;
    }
};
 
int main()
{
    ForbiddenDomains data;
    string s;
    cin >> s;
    data.AddDomain(s);
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.06.2020, 14:12
Ответы с готовыми решениями:

Хеш функция
Всем добрый день! В общем, нужно подсчитать кол-во коллизий. За это отвечает функция size_t...

Хеш функция
Здравствуйте. Помогите с задачей. Таблица строиться по методу цепочек с использованием...

Шаблоны. Хеш-функция
Добрые день. Есть задание сделать телефонную книгу. Поиск в базе сделать через хеш-функцию. ...

Хеш-функция, двойное хеширование
Всем привет! Пишу курсач, нужна хеш-функция, которая принимала бы строку и возвращала некий...

9
6770 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
05.06.2020, 15:31 2
Цитата Сообщение от EvilingDark Посмотреть сообщение
Что-то я не могу понять, чего не хватает. Хешер на 34 строке.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
using namespace std;
 
struct Domain;
struct DomainHasher 
{
    size_t operator()(const Domain& d) const;
};
 
struct Domain {
public:
    string current;
    unordered_set<Domain, DomainHasher> next;
    bool cancel;
.......................................
};
 
inline
size_t DomainHasher::operator()(const Domain& d) const
{
    const hash<string> shash;
    return shash(d.current);
}
Добавлено через 1 минуту
А что такое
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
unordered_set<Domain, DomainHasher> next;
?
0
Эксперт С++
8483 / 6150 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
05.06.2020, 15:55 3
Компилятору в данном случае нужно видеть весь класс полностью пред-объявление DomainHasher в данном случае не помогает.
0
0 / 0 / 0
Регистрация: 15.05.2012
Сообщений: 200
05.06.2020, 16:19  [ТС] 4
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
А что такое?
Мне в каждый домен нужно будет положить еще несколько и в них тоже надо будет положить несколько доменов, в общем я не знаю насколько длинным получится что-то типо дерева. А что с этой штукой какие-то проблемы?

Цитата Сообщение от Avazart Посмотреть сообщение
Компилятору в данном случае нужно видеть весь класс полностью пред-объявление DomainHasher в данном случае не помогает.
Ну сделал так. Но все еще не работает.
invalid use of incomplete type 'const struct Domain'
return shash(d.current);

invalid application of 'sizeof' to incomplete type 'Domain'
: std::aligned_storage<sizeof(_Tp), std::alignment_of<_Tp>::value>

using invalid field '__gnu_cxx::__aligned_buffer<_Tp>::_M_storage'
return static_cast<void*>(&_M_storage);


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
struct Domain;
 
struct DomainHasher {
    size_t operator()(const Domain& d) const
    {
        const hash<string> shash;
        return shash(d.current);
    }
};
 
struct Domain {
public:
    string current;
    unordered_set<Domain, DomainHasher> next;
    bool cancel;
 
    bool operator==(const Domain& rhs) { return current == rhs.current; }
 
    bool operator==(const string& rhs) { return current == rhs; }
 
    bool operator==(const string_view& rhs) { return current == rhs; }
};
0
Эксперт С++
8483 / 6150 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
05.06.2020, 16:22 5
Блин Вам oleg-m1973, показал как нужно.
0
0 / 0 / 0
Регистрация: 15.05.2012
Сообщений: 200
05.06.2020, 16:28  [ТС] 6
Цитата Сообщение от Avazart Посмотреть сообщение
Блин Вам oleg-m1973, показал как нужно.
Чот я не догадался, но оно тоже не работает.

invalid application of 'sizeof' to incomplete type 'Domain'
: std::aligned_storage<sizeof(_Tp), std::alignment_of<_Tp>::value>

using invalid field '__gnu_cxx::__aligned_buffer<_Tp>::_M_storage'
return static_cast<void*>(&_M_storage);

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
using namespace std;
 
struct Domain;
 
struct DomainHasher {
    size_t operator()(const Domain& d) const;
};
 
struct Domain {
public:
    string current;
    unordered_set<Domain, DomainHasher> next;
    bool cancel;
 
    bool operator==(const Domain& rhs) { return current == rhs.current; }
 
    bool operator==(const string& rhs) { return current == rhs; }
 
    bool operator==(const string_view& rhs) { return current == rhs; }
};
 
inline size_t DomainHasher::operator()(const Domain& d) const
{
    const hash<string> shash;
    return shash(d.current);
}
0
6770 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
05.06.2020, 16:35 7
---

Добавлено через 1 минуту
Цитата Сообщение от EvilingDark Посмотреть сообщение
Чот я не догадался, но оно тоже не работает.
Подозреваю, нельзя делать внутри класса unordered_set на себя. Хотя в майкрософте проканало

Добавлено через 1 минуту
Сделай
C++
1
unordered_set<std::unique_ptr<Domain>, DomainHasher> next;
И DomainHasher поправь соответственно
0
Эксперт С++
8483 / 6150 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
05.06.2020, 16:39 8
Значит нужно использовать указатели а не объекты или менять архитектуру.
0
6770 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
05.06.2020, 16:40 9
Цитата Сообщение от Avazart Посмотреть сообщение
Значит нужно использовать указатели а не объекты или менять архитектуру.
По-моему - последнее будет правильно
0
Эксперт С++
8483 / 6150 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
05.06.2020, 18:38 10
Ошибка по тому что необходимо знать размер типа

gcc\i686-w64-mingw32\7.3.0\include\c++\ext\aligned_buffer.h:85: ошибка: invalid application of 'sizeof' to incomplete type 'Domain'
: std::aligned_storage<sizeof(_Tp), std::alignment_of<_Tp>::value>
^
Добавлено через 1 час 56 минут
C++
1
2
3
4
5
6
7
8
9
10
11
 vector<string_view> Parse(const string& domain)
    {
        string_view s { domain };
        vector<string_view> parseDomain;
        while (!s.empty()) {
            auto dot = s.find('.');
            parseDomain.push_back(s.substr(0, dot));
            s.remove_prefix(dot + 1);
        }
        return parseDomain;
    }
Кстати не совсем понятный split() не понятно зачем делать remove_prefix
0
05.06.2020, 18:38
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.06.2020, 18:38
Помогаю со студенческими работами здесь

Хеш-функция и вывод в ассоциативный массив
Всем привет, есть функция, которая хеширует некоторую строку. Не знаю как добавить вывод пары...

Хеш-функция и вывод в ассоциативный массив
Всем привет, есть функция, которая хеширует некоторую строку. Не знаю как добавить вывод пары...

Объясните как работает хеш-функция
int Hash_Function1(DrugStore object) { int result = 0; for (int i = 0; i &lt;...

Нужна хеш-функция для программы на языке С++
К моей программе необходимо прикрутить функцию для вычисления хеша. Подскажите, пожалуйста,...

Метод открытого хеширования и хеш-функция, основанная на методе деления с остатком
Ещё раз здравствуйте! Есть такое задание: Написать программу, которая реализует метод...

Метод закрытого хеширования с двойным хешированием и хеш-функция, основанная на методе деления с остатком
Доброго времени суток! Прошу помощи у более опытных прогорев. До этого никогда не работал с...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru