C++ - 弹出向量的第一个元素

Posted

技术标签:

【中文标题】C++ - 弹出向量的第一个元素【英文标题】:C++ - Popping the first element of a vector 【发布时间】: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 解决了我的问题,谢谢! 【参考方案1】:

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

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

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

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


希望对你有帮助。

【讨论】:

以上是关于C++ - 弹出向量的第一个元素的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C++ 中检索矩阵的每个向量的第一个元素?

在 C++ 中并行查找向量的第一个

查找向量中的第一个缺失元素

C++ 合并和排序 2 个向量

堆栈/堆中的向量元素?长输入,C++

从特定的第一个元素获取向量对的第二个元素