HashTable删除函数C ++

时间:2013-04-10 23:39:36

标签: c++ hashtable

我是C ++的新手,我正在使用HashTables创建一个程序。这是作业。这是我第一次使用和创建HashTables,所以请事先原谅我,因为我不完全知道我在做什么。我现在面临的主要问题是合并我的remove()功能。我可以得到编译的代码,但是当我运行测试程序时,它会崩溃。我收到的错误

  

列表迭代器不可递减

我的删除功能是基于我教授为我们提供的插入功能。刚改变了一些事情。这是我的课程HTable和我的remove()功能。

class HTable
{
public:
    HTable(int size);
    void insert(  const string &s);
    void remove(string key);

private:
    vector<list<string>> List;
    int currSize;
    int tableSize;
    int hash(const string &key);
    int hashFunction(string key);
    int HTableSize;
    int *status_arr;
    ostream &   operator <<( ostream &);
};

remove()功能

inline void HTable::remove(string key)
{
    list<string> List;

    if( find( List.begin( ), List.end( ), key )  ==  List.begin( ) )
    {
        List.pop_back();
    }
}

3 个答案:

答案 0 :(得分:0)

inline void HTable::remove( string key)
{
   list<string> List;

   if( find( List.end( ), List.begin( ), key )  ==  List.begin( ) )
   {         //^^^^^^^^^^^^^^^^^^^^^^^^^
     List.pop_back();
   }

}

如果您根据查找原型使用List.begin()算法,则应将List.end()放在find之前:

template<class InputIterator, class T>
InputIterator find (InputIterator first, InputIterator last, const T& val)

同时

first, last Input iterators to the initial and final positions in a sequence. The range searched is [first,last), which contains all the elements between first and last, including the element pointed by first but not the element pointed by last.

此外,您的查找条件错误:

 if( find( List.begin( ), List.end( ), key )  !=  List.end( ) )
 {                                            //^^^^^
    //if key exist, remove
 }

在您的代码中,它会一直移除,直到本地List为空。

您的删除功能应如下所示:

 inline void HTable::remove( string key)
 {
   vector<list<string> >::iterator it;
   for ( it = List.begin(); it != List.end(); it ++)
   {

     if( find( (*it).begin( ), (*it).end( ), key )  !=  (*it).end( ) )
     {
        (*it).pop_back();
     }
   }
}

答案 1 :(得分:0)

如果你想向后遍历列表,请使用rbegin和rend来获取反向迭代器(如果你需要这个,是的 - 有时可能更好,更快:取决于上下文):

for (std::list<...>::reverse_iterator it=list.rbegin(); it!=list.rend(); ++it)

你也可以使用auto:

for( auto it=list.rend(); it!=list.rbegn(); ++it ) {...}

答案 2 :(得分:0)

由于您要通过查找确切的值从列表中删除,因此让标准模板库更方便您的帮助。

对于C ++ 98,创建一个谓词对象,用于检查对象是否相等:

struct string_equal
{
   string_equal(const std::string& tgt) : target(tgt)
   {}

   bool operator()(const std::string& key) const
   {
      return key == target;
   }

   const std::string& target;
};

void remove(const std::string& key)
{
   // find the appropriate list in your vector
   list<string>& List = get_correct_list_for_key(key);

   list<string>::iterator new_end = std::remove_if(List.begin(), List.end(), string_equal(key));

   List.erase(new_end, List.end());
}

在C ++ 11中,使用lambda:

可以更轻松地完成此操作
void remove(const std::string& key)
{
   list<string>& List = get_correct_list_for_key(key);

   auto new_end = std::remove_if(List.begin(), List.end(),
     [&] (const std::string& target) -> bool { return target == key; });

   List.erase(new_end, List.end());
}