SAMI MUSHTAQ Ответов: 1

Пожалуйста, удалите мои ошибки


#include <iostream>
#include <vector>
using namespace std;

class HashTableExample 
{
  private:

    int currentSize;
    int maxSize;
    vector<string> keys;
    vector<string> vals;

    int hashkey(string key) 
    {
      return hash<string>{}(key) % maxSize;
    }

  public:

    HashTableExample() {}

    HashTableExample(int capacity)
    {
      currentSize = 0;
      maxSize = capacity;

      for(int i = 0; i < maxSize; i++)
      {
        keys.push_back("");
        vals.push_back("");
      }
    }

    string toString()
    {
      int k = keys.size();
      int v = vals.size();

      string str = "";
      str += "HashTableExamle [currentSize=" + to_string(currentSize);
      str += ", maxSize=" + to_string(maxSize) + 
      
      str += ", keys=";
      for (int i = 0; i < k; i++)
      {
        str += keys[i] + " ";
      }

      str += ", vals=";
      for (int i = 0; i < v; i++)
      {
        str += vals[i] + " ";
      }

      return str;
    }

    void makeEmpty()
    {
      currentSize = 0;
      for(int i = 0; i < maxSize; i++)
      {
        keys[i] = "";
        vals[i] = "";
      }
    }

    int getSize()
    {
      return currentSize;
    }

    bool isFull()
    {
      return currentSize == maxSize;
    }

    bool isEmpty()
    {
      return getSize() == 0;
    }

    bool contains(string key)
    {
      return get(key) != "";
    }

    void insert(string key, string val)
    {
      int tmp = hashkey(key);
      int i = tmp;

      do 
      {
        if (keys[i] == "") 
        {
          keys[i] = key;
          vals[i] = val;
          currentSize++;
          return;
        }

        if (keys[i] == key) 
        {
          vals[i] = val;
          return;
        }
        
        i = (i + 1) % maxSize;
      } 
      while (i != tmp);
    }
    
    string get(string key) 
    {
      int i = hashkey(key);
      
      while (keys[i] != "") 
      {
        if (keys[i] == key)
          return vals[i];
        i = (i + 1) % maxSize;
      }
      
      return "";
    }
    
    /** Function to remove key and its value **/
    void remove(string key) 
    {
      if (!contains(key))
        return;
        
      /** find position key and delete **/
      int i = hashkey(key);
      
      while (!(key == keys[i]))
        i = (i + 1) % maxSize;
      
      keys[i] = vals[i] = "";
      
      /** rehash all keys **/
      for (i = (i + 1) % maxSize; keys[i] != ""; i = (i + 1) % maxSize) 
      {
        string tmp1 = keys[i], tmp2 = vals[i];
        keys[i] = vals[i] = "";
        currentSize--;
        insert(tmp1, tmp2);
      }
      
      currentSize--;
    }
    
    /** Function to print HashTable **/
    void printHashTable() 
    {
      cout << endl << "Hash Table: " << endl;
      for (int i = 0; i < maxSize; i++)
        if (keys[i] != "")
          cout << keys[i] << " " << vals[i] << endl;
      cout << endl;
    }
};

int main() 
{
  cout << "Hash Table" << endl << endl;
  cout << "Enter size" << endl;
  int size;
  cin >> size;
  
  HashTableExample hash(size);

  char ch;
  do 
  {
    cout << "\nHash Table Operations\n" << endl;
    cout << "1. insert " << endl;
    cout << "2. remove" << endl;
    cout << "3. get" << endl;
    cout << "4. clear" << endl;
    cout << "5. size" << endl;
    cout << "6. exit" << endl;
    int choice;
    cin >> choice;

    string key, value;
    cout << endl;
    switch (choice) 
    {
      case 1:
        cout << "Enter key and value" << endl;
        cin >> key >> value;
        hash.insert(key, value);
        break;
      case 2:
        cout << "Enter key" << endl;
        cin >> key;
        hash.remove(key);
        break;
      case 3:
        cout << "Enter key" << endl;
        cin >> key;
        cout << "Value = " << hash.get(key) << endl;
        break;
      case 4:
        hash.makeEmpty();
        cout << "Hash Table Cleared\n" << endl;
        break;
      case 5:
        cout << "Size = " + to_string(hash.getSize()) << endl;
        break;
      default:
        cout << "Wrong Entry \n " << endl;
        break;
    }

    /** Display hash table **/
    hash.printHashTable();
    cout << "Do you want to continue (Type y or n) " << endl;
    cin >> ch;
  } 
  while (ch == 'Y' || ch == 'y');
}


Что я уже пробовал:

ошибки не могут удалить хэш-ошибку и ошибку to_string

OriginalGriff

Где же ошибки?
Какие сообщения об ошибках вы получаете?
Что ты сделал, чтобы заполучить их?
Что вы пытались сделать, чтобы исправить их?

SAMI MUSHTAQ

t0_string не объявляется в этой области видимости
хэш не объявляется в этой области

Richard MacCutchan

Какие линии? Я не могу найти никаких ссылок на t0_string. И вы не определили хэш-объект для вставки, удаления и т. д. функции.

CPallini

Опубликованный код компилируется и отлично работает на моем Linux-боксе.

1 Ответов

Рейтинг:
0

OriginalGriff

САМИ МУШТАК:
t0_string не объявляется в этой области видимости
хэш не объявляется в этой области

Если я попытаюсь скомпилировать ваш код с помощью онлайн-компилятора C++ : https://www.onlinegdb.com/online_c++_компилятор[^]
Он не находит ошибок компиляции, действительно, кажется, что он работает.
Таким образом, либо вы показали нам неправильный код, либо вы компилируете неправильный код.

Мы не можем помочь вам ни с тем, ни с другим!


Stefan_Lang

Я могу подтвердить это, хотя я ожидал бы, что код нуждается в #include <string>. Возможно, в этом и заключается проблема: в то время как некоторые реализации могут включать "строку" в iostream, другие-нет.

OriginalGriff

string является частью std - std::string, поэтому "using namespace std" должен охватывать его.
http://www.cplusplus.com/reference/string/string/

Stefan_Lang

Я знаю, что имел в виду, что для использования string - с std:: - обычно вам нужно #include <string>. Но он этого не сделал. Это работает на некоторых компиляторах, если они действительно включают строку в заголовок iostream, но спецификация C++ этого не требует. Поэтому включения только iostream может быть недостаточно, в зависимости от компилятора.

Смотрите здесь: https://stackoverflow.com/questions/16506095/do-i-have-to-use-include-string-beside-iostream