std :: find()返回的迭代器不可解除引用

时间:2018-06-06 03:46:28

标签: c++ c++11 iterator c++-standard-library

这是带有链接的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
        }
    }
}

1 个答案:

答案 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。然而你取消引用它。

我认为条件应该相反,而是使用==