Я реализовал простой пользовательский неупорядоченный набор контейнеров, который использует хеширование. Внутри он хранит данные примерно так:
class Set
{
T *data = nullptr;
bool *emptyList = nullptr;
int size = 0;
... (inner methos go here)
};
То есть он хранит два массива. Один называется data
с фактическими значениями шаблонного типа T
и еще один называется emptyList
с bool
значения, которые отмечают, считается ли в этой позиции набор пустым или нет.
Таким образом, линейное исследование для сохранения новых значений, а также удаление записей становятся намного дешевле. Оба становятся, соответственно, просто вопросом поиска следующего emptyList[index] = true
или установить его в true
,
В настоящее время я разрешаю итерацию по значениям, хранящимся в наборе, как for(auto i : set_instance)
имея следующие открытые функции-члены в заданном классе:
T* begin() const { data[0] };
T* end() const { data[end] };
Проблема с этим, конечно же, заключается в том, что дальний цикл for также обращается к записям в data
к ним нельзя обращаться, так как они отмечены в emptyList
как пустой
Есть ли способ для меня, чтобы когда пользователь пытается перебрать множество с помощью циклических циклов, только записи в data
которые соответствуют записям в emptyList
которые не помечен как true
действительно доступны / обрабатываются в цикле?
Задача ещё не решена.
Других решений пока нет …