【问题标题】:C++ - Popping the first element of a vectorC++ - 弹出向量的第一个元素
【发布时间】:2019-10-04 16:45:51
【问题描述】:

如果这是重复的,我深表歉意。我保证我会先尝试找到答案。

我想使用向量创建一个二进制堆。为此,我必须实现一个弹出函数,该函数删除“顶部”。在这种情况下,它只是删除了第一个元素。

我尝试使用移动功能,例如:

items[Root()] = std::move(items[cur_size--]);

这应该将根与另一个元素交换,然后它会重新排序(这也没有工作)。

相反,我尝试了以下方法:

std::vector<int> items;
int root = 0;
size_t Root() {
  return root;
}

void Pop() {
  items.erase(items.begin()+root);
  root++;
  // here I would call the reorder function
}

通过这种方式,我将有效地更改根并像向量从第 n 个位置开始一样操作,而不是从 0 开始。

我的问题是,这有意义吗,还是有更好的方法可以实现它?

编辑:添加矢量

【问题讨论】:

  • 为什么不增加/减少索引而不是移动所有数据?
  • @Jose 这就是我在第二部分中所做的,移动根索引并擦除原始根
  • 片段有点小,无法真正理解第一个代码的问题。你确定你的意思是[cur_size--]?经常用数组/向量代码,cur_size表示数组末尾之后的元素,所以在贬义之前索引是错误的,所以你的意思可能是[--cur_size]
  • @GemTaylor 解决了我的问题,谢谢!

标签: c++ vector erase binary-heap


【解决方案1】:

要弹出std::vector 的第一个元素(我们称之为myvector),您只需编写:

myvector.erase(myvector.begin()); // pop front

现在,如果您将一棵二叉树存储到 std::vector 中,删除根将留下两个孩子(两个根)。

如果您只想保留两个子树中的一个,则需要选择您想要的一个(新根)。
然后,取决于您的std::vector 是否将二叉树存储在 广度优先深度优先,您必须搜索与您想要的子树相关的所有元素保留(Breadth-first searchDepth-first search)并使用所需的子树构建另一个 std::vector
最后,您将计算的子树影响到原始向量。


希望对你有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-22
    • 1970-01-01
    • 2016-08-01
    • 1970-01-01
    • 2019-05-10
    • 2015-07-19
    • 2021-11-21
    相关资源
    最近更新 更多