是否可以修改STL并自定义成员函数



对于我的一个项目,我需要经常弹出向量中的第一个元素。我可以使用.ecrease()成员函数,有人建议我将容器更改为deque。

我只是天真地想,如果我能添加一个成员函数pop_front(),那就太好了。对于我的情况,这个函数只会执行一些操作。首先,它向头迭代器添加1(如果有一个名为"head"的类型迭代器的私有成员),从而.begin()返回新的开始迭代器,然后从大小中减去1(如果存在一个名"size"的未签名类型的私有成员,然后继续修改其他受影响的成员。所以每当我调用.pop_front()时,它只会执行这几项操作,听起来很有效吗?

这是可以做到的吗?还是这个想法只会导致一团糟?如果可以的话,到目前为止,我能想到的坏的一面是,在做"矢量风格的矢量"时可能会发生一些边界问题,而在我的项目中,这些问题永远不会出现。

我注意到,如果没有重新分配,.resize()的复杂性与插入/删除的元素数量成线性关系。我想知道为什么它不是恒定的?为什么.resize()不重置结束迭代器(如果有一个名为"end"的迭代器类型的私有成员)?

当然,我可能完全错误地理解了STL容器是如何实现的。。

谢谢!

你的问题中有两个不相关的问题,这不好。

如果你真的想篡改std::vector的内部——你可以做的是从实现中复制std::vector的源代码,将其重命名为myvector(并将其从namespace std中移出),并以任何你想要的方式修改其内部。在这条路上有许多发现在等着你。

更简单的方法是围绕std::vector制作一个自定义容器——要么通过子类化它,要么通过组合更好(参见子类/继承标准容器?)

关于resize()复杂性——擦除的元素必须被销毁(也就是说,必须调用析构函数),插入的元素必须构造(调用构造函数),因此在非平凡的销毁/构造的情况下分别具有线性复杂性。

我认为您误解了STL容器(特别是向量)的工作方式。

std::vector< T> v(n);布局了一个长度为n的T类型的数组。没有pop_front()的原因如下:假设您想"弹出"数组的第一个元素。现在,所有剩余的元素都必须重新索引!因此,我们必须将剩余的n-1个元素最多向前一个,在末尾留下未使用的额外空间。然后减小大小,在这个过程之后,所有迭代器都将无效。

从一个天真的角度来看,如果你想这样做,那么只需调用erase().。然而,无论你把这个过程称为什么,或者它在哪里实现,它都会很慢。更喜欢不同的数据结构(可能是出列)或其他对您的问题更有意义的容器。

最新更新