在运行时固定大小std :: vector?

时间:2017-03-08 13:22:15

标签: c++ c++11 vector c++14

在我的应用中,性能至关重要

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

所以我考虑为resize使用包装器类,提供其所有功能,但无法调用reservepush_backCCVector.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我需要的begin方法!例如endsizestd::vector等,我不知道如何实现所有这些...此外,这对于维护来说真的很糟糕:我需要的是来自CCVector的新方法我需要在std::experimental::dynarray中重新实现它。

所有这些因为我想在运行时使用固定大小的数组。如何在不使用非标准{{1}}的情况下解决此问题?

3 个答案:

答案 0 :(得分:6)

使用私有继承,然后使用using声明导入所需的函数,以便将您想要的名称引入您的类中。

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

(使用私有继承,你不会遇到没有虚拟析构函数的向量问题,这是大多数人不喜欢从标准容器继承的原因)

答案 1 :(得分:0)

你是对的std::vector有很多成员函数你需要暴露给外面,但是没有多少成员函数。例如,请参阅此处http://www.cplusplus.com/reference/vector/vector/

此外,您不需要(也不应该)自己重新实现std::vector - 依靠经过测试的快速代码,就像您的STL几乎总是更好的选择。

所以,不要重新实现,只需将函数“转发”到外部,如下所示:

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

这是一些样板代码,但如果你对std::vector的非调整大小函数执行一次,那么就完成了。

编辑:

此外,不要继承std::vector。出于多种原因,这是个坏主意。

好的,我在这里有点快,抱歉。正如评论和this post所暗示的那样,从STL容器继承本身并不是坏事。特别是如果您使用私有继承,它可能只是给定任务的有效解决方案。

答案 2 :(得分:0)

私有继承 For(int i = 1 To 10){ For(int k = 1 To 20){ DrawSquare(i*10, k*10, "block type") k = k + 1 } i = i + 1 } 与其他答案中提出的建议是一种方法。

使用可调整大小的容器会有一些内存开销,其中不可调整大小就足够了。 DrawSquare(i*10, k*10, Array[i,k]) 通常约为数据指针大小的4倍。您可以将指向数据+长度的指针存储在其中的一半:

std::vector

显然缺点是你必须重新实现所有样板文件,否则你可以继承std::vector。也就是说,所有的样板都非常简单 - 只有很多。