我是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();
}
}
答案 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());
}