对于我的一个项目,我需要经常弹出向量中的第一个元素。我可以使用.erase()成员函数,我被建议将容器更改为deque。
我只是想,天真地,我可以添加成员函数pop_front()会很棒。对于我的情况,这个功能只会做一些操作。首先,它向头部迭代器添加1(如果'类型迭代器的私有成员称为" head"),以便.begin()返回新的开始迭代器,然后从大小中减去1(如果有一个名为unsigned的私有成员名为" size"),然后继续修改将受影响的其他成员。所以每当我调用.pop_front()时,它只会执行一些操作,听起来很有效吗?
这是可以做的事情还是这个想法会导致一团糟?如果它可以做到,到目前为止,我可以想到的不好的一面是,在矢量风格"中执行矢量时会发生一些边界问题,这在我的项目中永远不会出现。
我注意到.resize()的复杂性在插入/擦除的元素数量上是线性的,如果没有重新分配的话。我想知道它为什么不恒定?为什么没有.resize()只是重置结束迭代器(如果有一个名为迭代器的私有成员名为"结束")?
当然,我对错误理解STL容器的实施方式是错误的。
谢谢!
答案 0 :(得分:3)
你的问题中有两个不相关的问题,这是不好的。
如果你真的想摆弄std::vector
的内部 - 你可以做的是从你的实现中复制std::vector
的源代码,将其重命名为myvector
(并移动它)超出namespace std
)并以您想要的任何方式修改其内部。很多发现都在等着你。
更简单的方法是在std::vector
周围创建一个自定义容器 - 通过子类化,或者通过组合更好(参见Subclass/inherit standard containers?)
关于resize()
复杂性 - 必须销毁已擦除的元素(即必须调用析构函数),必须构造插入的元素(称为构造函数),因此分别在非平凡的销毁/构造的情况下线性复杂。
答案 1 :(得分:0)
我认为你误解了STL容器(特别是vector)是如何工作的。
std::vector< T> v(n);
列出长度为n的T类型的数组。由于以下原因,没有pop_front()
:假设您要“弹出”数组的第一个元素。现在每个剩余的元素都必须重新编制索引!因此,我们必须将大多数剩余的n-1个元素前进一个,在末尾留下未使用的额外空间。然后减小大小,在此过程之后,所有迭代器都将失效。
从一个天真的角度来看,如果你想这样做,那么只需要调用erase().
但是,无论你怎么称呼这个程序或它的实现,它都会很慢。首选不同的数据结构(可能是出队)或其他一些对您的问题更有意义的容器。