gpt4 book ai didi

c++ - boost ptr_vector 迭代器

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:26:15 28 4
gpt4 key购买 nike

我正在遍历树节点的子节点。子级存储在 ptr_vector 中,在整个迭代过程中的某个时刻我陷入无限递归,但我不明白为什么。

这里是无限递归发生的方法(这个方法只是用来打印树结构到cout):

std::ostream& operator<<(std::ostream &strm, const node &n) {
if (n.children_.empty())
return strm << "[]";

for (boost::ptr_vector<node::edge>::const_iterator iter = n.children_.begin(); iter != n.children_.end(); ++iter)
{
if (iter != n.children_.begin())
strm << ", ";
strm << "-" << iter->distance << "->[ " << *(iter->dest) << "]";
}

return strm;
}

这是我正在导航的树结构(请注意,嵌套 edge 的目的是表示父节点和子节点之间的距离):

class node
{
public:
node(void);
~node(void);

node* add_child(unsigned int d);
node* get_closest(void);

friend std::ostream& operator<<(std::ostream&, const node&);

private:
class edge
{
public:
edge(node* n, unsigned int d);
~edge(void);

unsigned int distance;
node* dest;
};

boost::ptr_vector<edge> children_;
};

此外,我注意到这种无限递归仅在调用以下方法之后发生:

node* node::get_closest(void) const
{
if (children_.empty())
return NULL;

boost::ptr_vector<node::edge>::const_iterator iter = children_.begin();
node::edge closest = *iter;
++iter;

if (iter != children_.end())
{
for (; iter != children_.end(); ++iter)
{
if (iter->distance < closest.distance)
closest = *iter;
}
}

return closest.dest;
}

为什么这个方法会导致无限递归?谢谢!

最佳答案

根据@RobI 的建议,原始指针和共享指针的混合导致了问题。我将 node::edge closest = *iter; 更改为 const node::edge* closest = &(*iter);。这是该方法的新(有效)版本:

node* node::get_closest(void) const
{
if (children_.empty())
return NULL;

boost::ptr_vector<node::edge>::const_iterator iter = children_.begin();
const node::edge* closest = &(*iter);
++iter;

if (iter != children_.end())
{
for (; iter != children_.end(); ++iter)
{
if (iter->distance < closest->distance)
closest = &(*iter);
}
}

return closest->dest;
}

关于c++ - boost ptr_vector 迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11974576/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com