固定在运行时固定大小的std ::向量
Fixed size std::vector at runtime?
性能在我的应用程序
中至关重要我需要像 std::experimental::dynarray
这样有效的东西,所以在运行时确定大小的数组。
因此,我考虑过将包装器类用于std::vector
,提供其所有功能,但无需致电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
的CC_9方法!例如begin
,end
,size
等在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容器继承并不是固有的不好。特别是如果您使用私有继承,它可能只是给定任务的有效解决方案。
- std::向量与传递值的动态数组
- 如何在旧c++中初始化const-std向量
- 如何检查两个 std::向量在小于 O(n) 的时间复杂度内是否相等
- 当键值是 std 向量时,为什么使用 at in C++ 访问映射值如此缓慢?
- 如何初始化 std::向量的映射?
- 迭代时将指向differents类型的指针保存在std::向量中
- std::向量迭代器和调整大小/保留的奇怪/有趣行为
- yaml-cpp到std::向量迭代的怪异行为
- 故意泄漏std::向量的内存
- 调整STD ::向量的大小是否可以降低其能力
- std ::向量距离函数如何给出比.size()更高的值
- C++ std::向量插入两个元素替代算法失败
- 错误:数字常数之前的预期无限制ID:std :: array和std ::向量大小分配
- 在我提供的此示例中,如何将2维std ::向量的逻辑更改为具有向量[row] [col] [col] [col] [co
- GUI滑块的动态数量,该数量更新具有回调中值的std ::向量
- 是一个std ::向量线程,我的目的是安全的
- 将具有std ::向量的C 函数称为Julia的输入和输出参数
- 将std ::向量作为指针参考
- STD ::向量如何调整其内部缓冲区大小
- 在C 中,是否有可能在不兼容类型的std ::向量对象之间传输不同类型的缓冲区