iterator returned by std::find() is not dereferenceable

陌路散爱 提交于 2019-12-02 16:06:06

问题


This is an insert() function of an implementation of a HashTable with chaining. In order to avoid duplications in the linked_list I ckecked if a value already exists. If it does then I just replace the existing value as it can be seen almost at the end where it comments "update value". That line issues an exception telling me that the iterator is not dereferenceable. Why can't I dereference the iterator returned by std::find()? Is there another way to update the value that was found?

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:


You have

if (it != m_table[index].m_list.end()) { // if found add it
    // Irrelevant...
} else {
    *it = v; // update value if exists
}

If the iterator it is not the end-iterator you do some irrelevant things. But in the else case the iterator it is equal to the end-iterator, and that is not dereferencable. And yet you dereference it.

I think the condition should be the opposite, using == instead.



来源:https://stackoverflow.com/questions/50711982/iterator-returned-by-stdfind-is-not-dereferenceable

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!