这是带有链接的HashTable实现的insert()函数。为了避免链接列表中的重复,如果值已经存在,我就会ckecked。如果它确实那么我只是替换现有的值,因为它几乎可以在它注释的最后看到"更新值"。该行发出异常,告诉我迭代器不可解除引用。为什么我不能取消引用std :: find()返回的迭代器?有没有其他方法来更新找到的值?
virtual void insert(const K& k, const V& v) {
auto index = hashFctn(k, m_table.capacity());
if (needsToGrow() || m_table[index].m_list.size() >= m_load_factor) {
rehash();
insert(k, v);
}
else {
auto it = std::find(m_table[index].m_list.begin(),
m_table[index].m_list.end(), v);
if (it != m_table[index].m_list.end()) { // if found add it
m_table[index].m_flag = flag::IN_USE;
m_table[index].m_key = k;
m_table[index].m_list.push_back(v);
m_nbrOfElements++;
} else {
*it = v; // update value if exists
}
}
}
答案 0 :(得分:5)
你有
if (it != m_table[index].m_list.end()) { // if found add it
// Irrelevant...
} else {
*it = v; // update value if exists
}
如果迭代器it
不是结束迭代器,那么你会做一些无关紧要的事情。但是在else的情况下,迭代器it
等于end-iterator,这不是dereferencable。然而你取消引用它。
我认为条件应该相反,而是使用==
。