user3477273
user3477273

Reputation:

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

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
        }
    }
}

Upvotes: 1

Views: 316

Answers (1)

Some programmer dude
Some programmer dude

Reputation: 409176

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.

Upvotes: 4

Related Questions