是否可以修改STL并制作自定义成员函数?
Is it possible to modify STL and make customized member functions?
对于我的一个项目,我需要经常弹出向量中的第一个元素。我可以使用 .erase() 成员函数,有人建议我将容器更改为 deque。
我只是天真地想,如果我能添加一个成员函数pop_front()就好了。对于我的例子,这个函数只会做一些操作。首先它向 head 迭代器添加 1(如果有一个名为 "head" 的迭代器类型的私有成员)以便 .begin() returns 成为新的开始迭代器,然后从大小中减去 1(如果有unsigned 类型的私有成员 "size"),然后继续修改其他将受到影响的成员。所以每当我调用 .pop_front() 时,它只会执行这几个操作,听起来很高效?
这是可以做到的还是这个想法只会导致大混乱?如果可以的话,到目前为止我能想到的不好的一面是做的时候可能会出现一些边界问题"vector in vector style",在我的项目中永远不会出现。
我注意到如果没有重新分配发生,.resize() 的复杂度与元素数量成线性关系 inserted/erased。我想知道为什么它不是恒定的?为什么 .resize() 不只是重置结束迭代器(如果有一个名为 "end" 的迭代器类型的私有成员)?
当然,我对 STL 容器的实现方式的理解可能全错了..
谢谢!
你的问题中有两个不相关的问题,这样不好。
如果您真的想 fiddle 使用 std::vector
的内部结构 - 您可以做的是从您的实现中复制 std::vector
的源代码,将其重命名为 myvector
(并将其移出 namespace std
)并以您想要的任何方式修改其内部结构。这条路上有很多发现等着你。
更简单的方法是在 std::vector
周围创建一个自定义容器 - 通过对其进行子类化,或者通过组合更好(参见 Subclass/inherit standard containers?)
关于 resize()
复杂性 - 必须销毁已删除的元素(即必须调用析构函数),必须构造插入的元素(调用构造函数),因此在非平凡的情况下具有线性复杂性 destruction/construction分别。
我认为您误解了 STL 容器(尤其是矢量)的工作原理。
std::vector< T> v(n);
布局一个长度为 n 的类型 T 的 数组。没有pop_front()
的原因如下:假设你想'pop'数组的第一个元素。现在每个剩余的元素都必须重新索引!因此,我们必须将剩余的 n-1 个元素最多向前移动一个,最后留下未使用的额外 space 。然后减小大小,在此过程之后所有迭代器都将失效。
从幼稚的角度来看,如果你想这样做,那么就调用 erase().
但是,无论你调用这个程序或在何处实现,它都会很慢。更喜欢不同的数据结构(可能出列)或其他一些对您的问题更有意义的容器。
对于我的一个项目,我需要经常弹出向量中的第一个元素。我可以使用 .erase() 成员函数,有人建议我将容器更改为 deque。
我只是天真地想,如果我能添加一个成员函数pop_front()就好了。对于我的例子,这个函数只会做一些操作。首先它向 head 迭代器添加 1(如果有一个名为 "head" 的迭代器类型的私有成员)以便 .begin() returns 成为新的开始迭代器,然后从大小中减去 1(如果有unsigned 类型的私有成员 "size"),然后继续修改其他将受到影响的成员。所以每当我调用 .pop_front() 时,它只会执行这几个操作,听起来很高效?
这是可以做到的还是这个想法只会导致大混乱?如果可以的话,到目前为止我能想到的不好的一面是做的时候可能会出现一些边界问题"vector in vector style",在我的项目中永远不会出现。
我注意到如果没有重新分配发生,.resize() 的复杂度与元素数量成线性关系 inserted/erased。我想知道为什么它不是恒定的?为什么 .resize() 不只是重置结束迭代器(如果有一个名为 "end" 的迭代器类型的私有成员)?
当然,我对 STL 容器的实现方式的理解可能全错了..
谢谢!
你的问题中有两个不相关的问题,这样不好。
如果您真的想 fiddle 使用 std::vector
的内部结构 - 您可以做的是从您的实现中复制 std::vector
的源代码,将其重命名为 myvector
(并将其移出 namespace std
)并以您想要的任何方式修改其内部结构。这条路上有很多发现等着你。
更简单的方法是在 std::vector
周围创建一个自定义容器 - 通过对其进行子类化,或者通过组合更好(参见 Subclass/inherit standard containers?)
关于 resize()
复杂性 - 必须销毁已删除的元素(即必须调用析构函数),必须构造插入的元素(调用构造函数),因此在非平凡的情况下具有线性复杂性 destruction/construction分别。
我认为您误解了 STL 容器(尤其是矢量)的工作原理。
std::vector< T> v(n);
布局一个长度为 n 的类型 T 的 数组。没有pop_front()
的原因如下:假设你想'pop'数组的第一个元素。现在每个剩余的元素都必须重新索引!因此,我们必须将剩余的 n-1 个元素最多向前移动一个,最后留下未使用的额外 space 。然后减小大小,在此过程之后所有迭代器都将失效。
从幼稚的角度来看,如果你想这样做,那么就调用 erase().
但是,无论你调用这个程序或在何处实现,它都会很慢。更喜欢不同的数据结构(可能出列)或其他一些对您的问题更有意义的容器。