C++ 类声明中固定大小的C样式数组
我遇到了一些代码,基本上如下所示:C++ 类声明中固定大小的C样式数组,c++,C++,我遇到了一些代码,基本上如下所示: #include<iostream> // in a header file class xxx{ public: xxx() { xxx_[0]=0; xxx_[1]=0; xxx_[2]=0;} double x0() const {return xxx_[0];} private: double xxx_[3]; // ??? }; // in the main.cpp int main(){ xxx
#include<iostream>
// in a header file
class xxx{
public:
xxx() { xxx_[0]=0; xxx_[1]=0; xxx_[2]=0;}
double x0() const {return xxx_[0];}
private:
double xxx_[3]; // ???
};
// in the main.cpp
int main(){
xxx x;
std::cout<<x.x0()<<"\n";
}
#包括
//在头文件中
xxx类{
公众:
xxx(){xxx_[0]=0;xxx_[1]=0;xxx_[2]=0;}
双x0()常量{return xxx_u0];}
私人:
双xxx_uu3];/???
};
//在main.cpp中
int main(){
xxx x;
std::cout将静态数组声明为类的成员没有什么错:
class A
{
int a[3];
};
上面的代码没有任何错误。它可能不是编写它的最佳方式,但它本身没有任何错误
是的,您的类xxx可以包含一个固定大小的数组作为成员。这在C中也是允许的
编译器,即使在读取头文件以使用它时,也知道结果是sizeof(xxx)的大小。这是允许的
然而,从设计角度来看,这通常并不理想;数组没有像std::array
那样的界面:
std::array<double,3> xxx_;
for (auto it : xxx_) {...}
xxx_.size()
std::transform (xxx_.begin(), xxx_.end(), ...);
std::数组xxx\ux;
for(auto-it:xxx{…}
xxx.尺寸()
std::transform(xxx_.begin(),xxx_.end(),…);
因此,如果您发现自己大部分时间都在使用(静态大小)数组作为容器,则应将其替换为std::array
(没有空间开销)。如果您需要动态大小的数组,请查看开销较小的std::vector
(但是,对于手动分配,您也必须记住大小,因此唯一的开销是容量).不要把这些东西乱放在你的代码里。@CJohnson:当我第一次看到它时,我的第一反应是,请你马上把它处理掉好吗?我个人会使用一个向量或数组。只是为了我的教育:选择std::array
vsstd有哪些大的优点和缺点::valarray
vsstd::vector
用于静态大小的连续内存随机访问容器?@Zhenya:根据我的经验:valarray
非常适合数字运算,尤其是GNU实现(使用表达式模板)。但它不是一个容器,它缺少begin()
,end()
和容器所需的其他内容。因此,它不能用于std::transform
或基于范围的。它仍然是:array
和vector
之间的问题仅仅是大小是否在编译时固定。array
没有任何空间开销,vector
必须记住它的大小和容量。但是,根据优化,差异可能会消失。