固定在运行时固定大小的std ::向量

Fixed size std::vector at runtime?

本文关键字:std 向量 运行时      更新时间:2023-10-16

性能在我的应用程序

中至关重要

我需要像 std::experimental::dynarray这样有效的东西,所以在运行时确定大小的数组。

因此,我考虑过将包装器类用于std::vector,提供其所有功能,但无需致电resizereservepush_back。话虽如此,所有改变其大小的方法(如果我错过了其中的一些方法,请提醒我)。

所以我开始写这堂课:

CCVector.hpp

template <typename T>
class CCVector{
public:
    CCVector(size_t size);
    T &operator[](typename std::vector<T>::size_type idx);
private:
    std::vector<T> v;
};

CCVector.cpp

template<typename T>
CCVector<T>::CCVector(size_t size) : v(size){}
template<typename T>
T& CCVector<T>::operator[](typename std::vector<T>::size_type idx){
    return  v[idx];
}

但是我这一点我认为我必须重新实现every std::vector的CC_9方法!例如beginendsize等在CCVector

所有这些,因为我想要在运行时固定尺寸数组。如何在不使用非标准std::experimental::dynarray的情况下解决此问题?

使用私有继承,然后使用using声明将您想要的名称引入您想要的名称。

template<class T>
class MyVector : private std::vector<T>
{
public:
    using std::vector<T>::end;
    // etc
};

(使用私有继承,您不会出现矢量没有虚拟破坏者的问题,这是大多数人不喜欢继承标准容器的原因)

私下继承的 std::vector是另一种答案中提出的一种方法。

有一些内存开销,用于使用可重新设备的容器,在该容器中,不可避免的容器就足够了。std::vector通常约为数据指针的〜4 x大小。您可以将数据 长度的指针存储在其中一半:

template<class T>
class dynarray
{
    std::unique_ptr<T[]> data;
    T*                   end; // or size_t size
    //TODO functions
};

不利的一面是您必须重新实现所有样板,否则您可以从std::vector继承。也就是说,所有的样板都很琐碎 - 只有很多。

您是正确的,std::vector具有很多成员功能,您需要暴露在外部,但没有很多thaaat。例如,请参阅此处http://www.cplusplus.com/reference/vector/Vector/

此外,您不需要(也不需要)重新进来std::vector - 依靠经过测试的快速代码(如STL)几乎总是更好的选择。

因此,不用重新进化,而只是将功能"转发"到外部,例如:

iterator begin()
{
   return v.begin();
}

这是一些样板代码,但是如果您一次对std::vector的非规定功能进行一次,则完成了。

编辑:

也不要从std::vector继承。这是一个坏主意。

好吧,我在这里很快,对此很抱歉。正如评论和这篇文章所暗示的那样,从STL容器继承并不是固有的不好。特别是如果您使用私有继承,它可能只是给定任务的有效解决方案。