Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <algorithm>
- #include <assert.h>
- #include <iostream>
- #include <forward_list>
- #include <string>
- #include <vector>
- using std::string;
- class CStringHashTable {
- public:
- explicit CStringHashTable( int initialSize );
- // Проверка наличия элемента.
- bool Has( const string& key ) const;
- // Добавление. Дубли не добавляет. Если элемента нет, то возвращает false.
- bool Add( const string& key );
- // Удаление. Если элемента не было, возвращает false.
- bool Remove( const string& key );
- private:
- std::vector<std::forward_list<string>> table;
- };
- CStringHashTable::CStringHashTable( int initialSize ) :
- table( initialSize )
- {
- }
- bool CStringHashTable::Has( const string& key ) const
- {
- // Получим хеш в диапазоне [0, m).
- const int hash = std::hash<string>()( key ) % table.size();
- // Ищем в нужном списке.
- const std::forward_list<string>& list = table[hash];
- return std::find( list.begin(), list.end(), key ) != list.end();
- }
- bool CStringHashTable::Add( const string& key )
- {
- // Получим хеш в диапазоне [0, m).
- const int hash = std::hash<string>()( key ) % table.size();
- // Ищем в нужном списке.
- std::forward_list<string>& list = table[hash];
- if( std::find( list.begin(), list.end(), key ) != list.end() ) {
- return false;
- }
- list.push_front( key );
- return true;
- }
- bool CStringHashTable::Remove( const string& key )
- {
- // Получим хеш в диапазоне [0, m).
- const int hash = std::hash<string>()( key ) % table.size();
- // Ищем в нужном списке.
- std::forward_list<string>& list = table[hash];
- if( std::find( list.begin(), list.end(), key ) == list.end() ) {
- return false;
- }
- // Удаление. Здесь не эффективно - поиск элемента выполняется второй раз.
- list.remove( key );
- return true;
- }
- int main()
- {
- CStringHashTable hashTable( 8 );
- char command = 0;
- string key;
- while( std::cin >> command >> key ) {
- switch( command ) {
- case '?':
- std::cout << ( hashTable.Has( key ) ? "OK" : "FAIL" ) << std::endl;
- break;
- case '+':
- std::cout << ( hashTable.Add( key ) ? "OK" : "FAIL" ) << std::endl;
- break;
- case '-':
- std::cout << ( hashTable.Remove( key ) ? "OK" : "FAIL" ) << std::endl;
- break;
- default:
- assert( false );
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement