Add HashTable::remove() and fix a bug where ConstIterator would skip the first.

This commit is contained in:
Andreas Kling 2018-10-13 14:22:09 +02:00
parent f794190de0
commit c2ef54c044
Notes: sideshowbarker 2024-07-19 18:49:17 +09:00
2 changed files with 48 additions and 3 deletions

View file

@ -186,12 +186,12 @@ public:
{
if (!isEnd && !m_table.isEmpty() && !(m_bucketIterator != DoublyLinkedList<T>::ConstIterator::universalEnd())) {
#ifdef HASHTABLE_DEBUG
printf("bucket iterator init!\n");
printf("const bucket iterator init!\n");
#endif
const DoublyLinkedList<T>& chain = m_table.m_buckets[0].chain;
m_bucketIterator = chain.begin();
skipToNext();
if (m_bucketIterator.isEnd())
skipToNext();
}
}
@ -207,6 +207,15 @@ public:
Iterator find(const T&);
ConstIterator find(const T&) const;
void remove(const T& value)
{
auto it = find(value);
if (it != end())
remove(it);
}
void remove(Iterator&);
private:
Bucket& lookup(const T&);
const Bucket& lookup(const T&) const;
@ -315,6 +324,14 @@ auto HashTable<T, TraitsForT>::find(const T& value) const -> ConstIterator
return end();
}
template<typename T, typename TraitsForT>
void HashTable<T, TraitsForT>::remove(Iterator& it)
{
ASSERT(!isEmpty());
m_buckets[it.m_bucketIndex].chain.remove(it.m_bucketIterator);
--m_size;
}
template<typename T, typename TraitsForT>
typename HashTable<T, TraitsForT>::Bucket& HashTable<T, TraitsForT>::lookup(const T& value)
{

View file

@ -155,5 +155,33 @@ int main(int, char**)
printInts(v);
}
{
auto printInts = [] (const HashTable<int>& h) {
printf("HashTable {\n size: %u\n capacity: %u\n elements: ", h.size(), h.capacity());
for (auto i : h)
printf("%d ", i);
printf("\n}\n");
};
HashTable<int> h;
h.set(10);
h.set(20);
h.set(30);
h.set(40);
h.set(50);
h.dump();
printInts(h);
h.remove(30);
printInts(h);
h.set(30);
h.remove(30);
printInts(h);
}
return 0;
}