C++:如何遍历指向指针数组的双指针
C++: How to iterate through a double pointer pointing to an array of pointers
在下面的代码中,我遍历了一个指向 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;
但是,我的代码一直陷入无限循环,即使数组的长度很小(e.x。4 或 5)。
注意:autograder 系统不允许我修改 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;
}
在 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
版本编译的结果。
在下面的代码中,我遍历了一个指向 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;
但是,我的代码一直陷入无限循环,即使数组的长度很小(e.x。4 或 5)。
注意:autograder 系统不允许我修改 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;
}
在 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
版本编译的结果。