Помимо моей прямой модификации кода , вот идея:
Вместо функции-члена _iterator_for_node
, которая
- имеет постоянные проблемы
- бесполезно тесно связан с конкретным типом контейнера (вызывая беспорядок разрешения шаблона имени типа)
- не делает ничего, кроме std :: find и выдает исключение, если не найдено
Я предлагаю вместо этого создать следующую статическую (глобальную / namespace) функцию:
template<class It, class T>
It checked_find(It begin, It end, const T& node)
{
It iter = std::find(begin, end, node);
if (iter != end)
return iter;
throw NoSuchNodeException();
}
Он будет работать с любым типом итераторов (включая не-STL, итераторы входного потока, только вперед, const, обратные итераторы ... вы называете это) и не требует явного различия между const / неконстантные версии:)
С ним
рабочая версия вашего кода будет просто читать
template<class T>
class AdjacencyList {
std::vector<T> _nodes;
public:
void delete_node(const T& node)
{ _nodes.erase(checked_find(_nodes.begin(), _nodes.end(), node)); }
};
Обратите внимание на сокращение кода. Всегда хороший знак
Приветствия