Я довольно новичок в C ++, поэтому заранее извиняюсь за мое ограниченное понимание, а также за то, что это мой первый пост по stackoverflow, я прошу прощения за форматирование, если оно не так.
Я работаю над заданием, что мы строим дерево двоичного поиска.По большей части я понимаю, как работает BST.Но в задании было несколько встроенных функций, и я немного запутался в том, как они работают.Концептуально я знаю, как работает BST и как должен вести себя порядок, но в рамках использования этих функций я запутался.
Самым необычным для меня является вызов функции в качестве аргумента и использование посещения, которое звучит как встроенная стандартная функция.
Что делает treevisitor?
Что я храню в treevisitor?
Что именно здесь происходит: b1.InorderTraverse (TreeVisitor :: visitor) ;?Какой аргумент передается здесь, я предполагаю, что поток строк
Что именно создается при вызове InorderTraverse?Я бы предположил, что вы захотите что-то вернуть, но я предполагаю, что древовидный посетитель что-то хранит для получения строкового результата.
Заранее благодарю за любую предоставленную помощь и извинения, если я не былдостаточно краткий с тем, что я спрашиваю.
Этот фрагмент кода существует в bst_test.cpp
class TreeVisitor {
public:
TreeVisitor() = delete;
// insert output to SS rather than cout, so we can test it
static stringstream SS;
static string GetSS() {
return SS.str();
}
static void ResetSS() {
SS.str(string());
}
// instead of cout, insert item into a string stream
static void visitor(const string &item) {
SS << item;
}
// instead of cout, insert item into a string stream
static void visitor(const int &item) {
SS << item;
}
};
Этот bst_test.cpp, предоставленный для использования, имеет это для проверки нашего inorderTraversal в main.cpp
TreeVisitor::ResetSS();
b1.InorderTraverse(TreeVisitor::visitor);
string result = "acfgx";
assert(TreeVisitor::GetSS() == result);
В нашем bst.hpp это есть, я добавил немного кода и вспомогательный метод, который вытащен из нашего учебника.
// Public function
void InorderTraverse(void visit(const T &item)) const {
inOrder(visit, rootPtr);
}
// Private Helper function
void inOrder(void visit(const T &item), Node* Ptr) const{
if(Ptr != NULL){
inOrder(visit, Ptr->leftPtr);
T item = Ptr->data;
visit(item);
inOrder(visit, Ptr->rightPtr);
}
}
Я считаю, что все это работает, потому что утверждение assert не возвращает ошибку.