在我的应用中,性能至关重要
我需要像std::experimental::dynarray
这样的东西,所以在运行时确定一个大小的数组。
所以我考虑为resize
使用包装器类,提供其所有功能,但无法调用reserve
,push_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
我需要的begin
方法!例如end
,size
,std::vector
等,我不知道如何实现所有这些...此外,这对于维护来说真的很糟糕:我需要的是来自CCVector
的新方法我需要在std::experimental::dynarray
中重新实现它。
所有这些因为我想在运行时使用固定大小的数组。如何在不使用非标准{{1}}的情况下解决此问题?
答案 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
。也就是说,所有的样板都非常简单 - 只有很多。