微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C++:如何遍历指向指针数组的双指针

如何解决C++:如何遍历指向指针数组的双指针

在下面的一段代码中,我将遍历一个指向 TreeNode 对象的指针数组的指针。下面是我遍历数组的代码

TreeNode* childListPointer = *currNode->children;


for (TreeNode* currChild = childListPointer; currChild != NULL; currChild = ++childListPointer) {
    std::cout << "Iteration" << endl;
}

下面是我的 TreeNode 结构的代码

typedef struct TreeNode { 
   int key;
   int val;
   bool flag;
   int num_children;
   TreeNode **children;
} TreeNode; 

但是,即使数组的长度很小(例如 4 或 5),我的代码也会陷入无限循环。

注意:自动分级系统不允许我修改 TreeNode 结构

解决方法

你的数组是一个大小和数量。

int num_children;
TreeNode **children;

基于此,您可以为 for(:) 循环制作一个简单的范围适配器:

template<class It>
struct range {
  It s,f;
  It begin() const { return s; }
  It end() const { return f; }
  range(It b,It e):s(b),f(e) {}
  range(It b,std::ptrdiff_t count):range(b,b+count) {}
};

现在,只需:

for(TreeNode* child : range{ currNode->children,currNode->num_children })
{
  std::cout << "Iteration" << endl;
}

之前,您需要一个 make_range

template<class It>
range<It> make_range( It b,It e ) { return {b,e}; }
template<class It>
range<It> make_range( It b,std::ptrdiff_t c ) { return {b,c}; }

for(TreeNode* child : make_range( currNode->children,currNode->num_children ))
{
  std::cout << "Iteration" << endl;
}

因为在 中添加了“演绎指南”。

你已经完成了。您现在可以迭代子项,而无需进行任何指针运算和混淆。

...

如果您被困在 ,您可以这样做:

for (int i = 0; i < currNode->num_children; ++i)
{
  TreeNode* child = currNode->children[i];
  std::cout << "Iteration" << endl;
}

TreeNode** it = currNode->children;
TreeNode** end = it+currNode->num_children;
for (; it != end; ++it)
{
  TreeNode* child = *it;
  std::cout << "Iteration" << endl;
}

这几乎就是 range 版本编译后的结果。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。