我正在创建一个N维向量的新实现(我们称之为VectorND
)来替换更大系统中的一些旧代码。
向量大小在编译时是已知的,因此c样式数组std::array
和std::vector
都是VectorND
类的基础数据结构的可行候选者。
我注意到向量传递了很多,并认为如果可以有效地移动新的VectorND
类,系统将会受益匪浅。 (我意识到很多'传递'将无法使用移动,但是矢量也经常出现为右移)
std::vector
类支持移动语义,因为c样式数组只是一个指针,它们都允许VectorND
类中的移动构造函数/赋值运算符。然而std::array
类需要移动O(n)时间,这对我来说听起来像这个“最明显的选择”实际上是最坏的情况。
对于剩下的两个,c样式数组可以作为单个内存块分配,因此确实使用了我们在编译时知道大小的事实。
我错过了什么或是c风格的数组确实是我VectorND
类的最佳底层容器吗?
(听起来很奇怪,较新的stl类将是一个更糟糕的选择)
编辑:在再次阅读我的帖子后,我意识到std::unique_ptr
到std::array
可能会给我两全其美的好处?
答案 0 :(得分:0)
我决定按照juanchopanza的建议去找std::vector
。正如我在问题中已经提到的那样,它可以被移动(在O(1)中)并且正如juanchopanza指出的那样,开销非常小。
此外我喜欢它让我可以选择将移动操作声明为默认值,从而提高代码可读性。 (我想添加一个虚拟析构函数,所以我需要添加它们,因为编译器在指定析构函数时不会生成它们)
对于那些感兴趣的人,相关的声明:
/// Copy constructor
VectorND(const VectorND &) = default;
/// Move constructor
VectorND(VectorND &&) = default;
/// Copy assignment
VectorND& operator=(const VectorND &) = default;
/// Move assignment
VectorND& operator=(VectorND &&) = default;
/// Destructor
virtual ~VectorND() = default;