Итератор, возвращаемый std :: find (), не является разыменованным - PullRequest
0 голосов
/ 06 июня 2018

Это функция вставки () реализации HashTable с цепочкой.Чтобы избежать дублирования в списке связанных элементов, я проверял, существует ли уже значение.Если это так, то я просто заменяю существующее значение, поскольку это можно увидеть почти в конце, где он комментирует «обновить значение».Эта строка выдает исключение, говорящее мне, что итератор не разыменовывается.Почему я не могу разыменовать итератор, возвращаемый 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 голосов
/ 06 июня 2018

У вас есть

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

Если итератор it не является конечным итератором, вы делаете неуместные вещи.Но в другом случае итератор it равен конечному итератору, и это не может быть разыменовано.И все же вы разыменовываете его.

Я думаю, что условие должно быть противоположным, используя вместо него ==.

...