如何解决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),我的代码也会陷入无限循环。
解决方法
你的数组是一个大小和数量。
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;
}
在 c++17 之前,您需要一个 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;
}
因为在 c++17 中添加了“演绎指南”。
你已经完成了。您现在可以迭代子项,而无需进行任何指针运算和混淆。
...
如果您被困在 c++03,您可以这样做:
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 举报,一经查实,本站将立刻删除。