c++ - 通用 "out of bounds", "past end"迭代器

标签 c++ tree iterator

在我的应用程序中,我有一个(不平衡的)树数据结构。这棵树只是由“std::list of std::lists”组成——节点包含一个任意的子节点“列表”。使用它而不是单个列表使应用程序的其余部分变得容易得多。 (该程序是关于将移动节点从一棵树更改为另一棵树/树中的另一部分/到它自己的树)。

现在一个明显的任务是在“树”中找到一个子树。对于非递归搜索,它很简单:

subtree_iterator find_subtree(const N& n) {         
    auto iter(subtrees.begin());
    auto e(subtrees.end());
    while (iter != e) {
        if ((*iter)->name == n) {
            return iter;
        }
        ++iter;
    }
    return e;
}

返回子树位置的迭代器。然而,当我尝试实现多级搜索时,问题就开始了。即,我想搜索 hello.world.test点标记新级别的位置。

搜索正常

subtree_iterator find_subtree(const pTree_type& otree, std::string identify) const {
    pTree_type tree(otree);
    boost::char_separator<char> sep(".");
    boost::tokenizer<boost::char_separator<char> > tokens(identify, sep);
    auto token_iter(tokens.begin());
    auto token_end(tokens.end());

    subtree_iterator subtree_iter;
    for (auto token_iter(tokens.begin()); token_iter != token_end; ++token_iter) {
        std::string subtree_string(*token_iter);
        subtree_iter = tree->find_subtree_if(subtree_string);
        if (subtree_iter == tree->subtree_end()) {
            return otree->subtree_end()
        } else {
            tree = *subtree_iter;
        }
    }
    return subtree_iter;
}

乍一看它似乎工作“正确”,但是当我尝试使用它时,它失败了。使用它就像

auto tIn(find_subtree(ProjectTree, "hello.world.test"));
if (tIn != ProjectTree->subtree_end()) {
    //rest
}

然而,这给出了调试断言错误“列表迭代器不兼容”。这并不太奇怪:我正在比较来自不同列表的迭代器。但是我可以实现这样的事情吗?我的“备份”选项是返回 std::pair<bool,iterator>其中 bool 部分确定树是否实际存在。是否有另一种方法,除了使整个树成为单个列表之外?

最佳答案

你不应该在内部处理迭代器。请改用节点。

template <typename T>
struct Node {
 T item;
 Node<T>* next;
};

然后像这样将您的 Node 封装在迭代器外观中:

template<typename T>
class iterator {
private:
  Node<T>* node;
public:
  ...
};

然后使用在到达或返回 end() 时返回的通用无效节点(当节点为 nullptr 时)。 请注意,我建议的是单链表(不是标准的双链表)。这是因为您无法从指向无效空节点的无效通用 end() 迭代器返回。 如果您不在算法中使用迭代器运算符--(),这应该没问题。

关于c++ - 通用 "out of bounds", "past end"迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13583866/

相关文章:

c++ - 不明确的类型引用

c++ - 在 C++ 中将字符串附加到 const char* 时出现编译时错误?

java - 检查树是否完整的算法

c++ - 打印二叉树的底部 View

ruby - 是否可以检查 Ruby 中迭代器的位置?

java - 如何将值存储为迭代器中的变量,for 循环?

c++ - 可以为晋升制定类型特征吗?

tree - 如何在序言中实现树算法的尾递归

iterator - 我该如何编写一个迭代器来返回对自身的引用?

c++ - 为什么在声明对象数组时不能使用 -> 运算符?