我一直在尝试创建一个模拟图上节点的节点类。当前,前置节点和后续节点的存储是通过节点指针向量std::vector<Node*> previous
来存储的。前置节点/后续节点的向量是私有变量,可以通过setters/getter访问。
目前,我正在处理添加新节点时更新指针值的问题。我目前更新前任/继任节点的方法是通过这种方法(继任/前任节点的方法相同,只是名称更改(:
void set_next(std::vector<Node*> new_next) {
this->next.clear();
for (Node* node : new_next) {
this->next.push_back(node);
}
}
这适用于当前节点,但我想知道更新传入的new_next
节点的最佳方法,尤其是最"C++"风格的方法。我之前写过一种方法,将单个节点添加到后继/前置向量中:
void add_next(Node* new_node, bool one_way = false) {
this->next.pushback(new_node);
if (!one_way) {
new_node->add_prev(this, one_way = true);
}
}
one_way
变量用于确定add_next((调用的深度(?(。如果为true,它将添加到new_node的后继集,然后添加到前置集。由于当new_node->add_next((方法调用时,它只会添加到前置集合中,而不会尝试再次调用add_next/add_prev((。这个解决方案确实有效,但我不希望有one_way
变量,并且希望该方法是私有的。
以下是当前类的结构:
class Node {
private:
std::vector<Node*> previous;
std::vector<Node*> next;
boost::any data;
public:
std::vector<Node*> get_previous()
void set_previous(std::vector<Node*> new_previous)
std::vector<Node*> get_next()
void set_next(std::vector<Node*> new_next)
void add_prev(Node* new_node, bool one_way = false)
void add_next(Node* new_node, bool one_way = false)
}
为了避免one_way
参数,我的最佳解决方案似乎是创建一个add_next/add_prev方法,它只更新当前节点,而不更新传递的节点,这与上面的解决方案不同。有了这个解决方案,当添加新节点时,我可以在新节点上调用add_next/add_prev的倒数。然而,我有一个暗示,可能有一个更好的解决方案。
谢谢!
我认为这应该会让你开始(边缘情况留给你来解决,如果有的话(:
template<typename T>
class Node {
// Everything made public for debugging purposes, change this to fit your needs
public:
std::vector<Node<T>*> previous;
std::vector<Node<T>*> next;
T data;
Node(T val) {
data = val;
}
void set_next(std::vector<Node<T>*>& new_next);
};
template<typename T>
void Node<T>::set_next(std::vector<Node<T>*>& new_next) {
next = new_next;
for (Node<T>* node : new_next)
node->previous.push_back(this);
}
int main() {
// Little proof of concept where 0 is parent to 1, 2, 3
Node<int> one = 1;
Node<int> two = 2;
Node<int> three = 3;
Node<int> zero = 0;
std::vector<Node<int>*> new_next = { &one , &two, &three };
zero.set_next(new_next);
return 0;
}
总结差异:
- 使用模板,
boost::any
是非标准的,对于这个任务来说非常糟糕 - 利用运算符(
=
复制std::vector
( - 利用引用类型(通过这种方式,您可以修改传递给函数的参数(