我正在尝试编写一个神经网络。我以前用其他语言做过,并使用矩阵库;但是,我想自己做,以便更好地理解它们。但是我的课程遇到了问题。
我在C ++中这样做。
我有一个名为ANN的课程。它有一个图层矢量。 layers是一个名为Node的类。 但是,在节点内我想访问前一层节点,所以我可以计算这个节点的值。
我知道如果我有一个类,我希望它的一个成员本身就必须是一个指针。 离。
class Node{
public:
// Public methods/members here
private:
Node *previousNode;
}
但是,这不是我想要的。
我希望*previousNode
成为节点的祖先
这是我想要的一个例子
class Node{
public:
//Public functions/members here
private:
vector <Node*> previousLayer;
}
现在我听说在这种情况下使用智能指针会更好。我不知道那是什么,我知道它基本上是管理它们的指针的包装器。我还认为使用智能指针的主要原因是因为某些指针在使用后会保留为NULL或未被删除,但我认为这并不重要,因为此类的范围只能在程序结束时结束。
我的问题是如何实现向量所在类的指针向量。
答案 0 :(得分:2)
如果我正确地解释您的问题,听起来您希望Node
的每个实例都包含指向其连接的其他Node
个对象的指针列表。
你所写的内容很好,但正如你所说,它可以使更安全的代码使用std::shared_ptr
。
class Node{
public:
//Public functions/members here
private:
vector <shared_ptr<Node>> previousLayer;
}
您应该使用std::make_shared
分配节点,只要它们被使用,它们就会在内存中保留(不需要new
或delete
。)
答案 1 :(得分:0)
std::vector <Node*> previousLayer;
如果你想使用迭代器处理向量中的所有元素:
for (auto it = previousLayer.begin(); it != previousLayer.end(); ++it)
{
Node* node = *it;
handle(node);
}
// Note: you can using "for (std::vector<Node*>::iterator it = previousLayer.begin(); it != previousLayer.end(); ++it)" instead.
如果您只想使用运算符[]:
访问一个元素Node* node = previousLayer[n];
handle(node);
// but be careful, don't make the n out of range. that means n must be "0 <= n < previousLayer.size()"