class Test
{
public:
Test():size(5){};
const int size;
// int arr[size];如何让数组的大小在初始化时可以改变
};
程序编译时会出错。有没有什么办法啊?
PS:不要使用宏,我着实不喜欢宏。
17 个解决方案
#1
可用enum
#2
class Test
{
public:
Test(){};
enum{size = 5};
int arr[size];
};
#3
看你这size是不是编译期常量了。。。
#4
改用vector
#5
动态的话就用vector吧,C++都实现好了。 自己写没必要。
#6
好吧,我刚好看到 CA2W 这个类的实现,就看到了如何动态确定数组大小的。
不过要用到模板:
template <int TLength = 128>
class Cls
{
private:
int arr[TLength];
};
之所以可以,是因为模板是静态编译时确定的。
不过要用到模板:
template <int TLength = 128>
class Cls
{
private:
int arr[TLength];
};
之所以可以,是因为模板是静态编译时确定的。
#7
new
长度长度长度长度长度
长度长度长度长度长度
#8
不需要自己写,已有std::array
编译器还不支援就去找boost
编译器还不支援就去找boost
#9
哎 为什么还用数组呢 试试vector
#10
enum确实不错,但是有类型上的问题。
#11
你的size在编译阶段是不知道值的,所以不符合数组的声明与定义方式。如果想坚持用数组的话,可以用动态开辟内存空间。int *iptr = new int[size];然后再初始化一下。当然你可以用STL中的容器啊,都是比数组好用的,就是比数组慢些。
#12
class Test
{
public:
Test():size(5){};
const int size;
int arr[]; //就这样不去指定不就行了,用的时候再指定长度。应该可以达到你想要的同样效果
};
{
public:
Test():size(5){};
const int size;
int arr[]; //就这样不去指定不就行了,用的时候再指定长度。应该可以达到你想要的同样效果
};
#13
楼主能说明一下想要的是在编译期决定array的大小还是执行期吧
顺便再说一下编译器,大伙才能决定该用C++98或C++11的解法
顺便再说一下编译器,大伙才能决定该用C++98或C++11的解法
#14
我不想使用不使用vector,第一是因为我实际写的是一个图像处理程序,用vector真心没有使用数组来得
我之前不想使用vector的确是处于效率的考虑,但是我的实际问题是这样的:
我写的是一个图像处理程序,对于每个像素,都会建立大小为5的结构体数组。由于数组的大小比较小,是不是使用vector与直接使用数组差别不大呢?
因为我知道,vector内部也是连续的,如果不停的pushback,当大小不够时会重新分配,但是我这边size是定的,可以在初始化vector时先确定大小,然后就可以避免重新分配造成的效率损失,我的想法对么?
#15
>我写的是一个图像处理程序
强烈推荐openCV2,对图像处理做了很多的优化
他的资料结构也是针对图像处理而设计的
>可以在初始化vector时先确定大小,然后就可以避免重新分配造成的效率损失
正确,vector的初始化你可以这样做
vector<type> A(640 * 480);
>如果不停的pushback,当大小不够时会重新分配
你对于push_back的猜测是正确的
空间不够的时候会重新分配一块更大的空间
强烈推荐openCV2,对图像处理做了很多的优化
他的资料结构也是针对图像处理而设计的
>可以在初始化vector时先确定大小,然后就可以避免重新分配造成的效率损失
正确,vector的初始化你可以这样做
vector<type> A(640 * 480);
>如果不停的pushback,当大小不够时会重新分配
你对于push_back的猜测是正确的
空间不够的时候会重新分配一块更大的空间
#16
这个很长见识啊,谢谢了。这学期我写了好多模板代码,看到您的这个之后我试了试,发现原来模板的东西很多我都还不知道呢。受教了!!!
#17
我看了15L的回答,我想我能说的也许就是那些了。说的很好,补充一下的是:STL中的容器慢的原因吧,这些都是泛型的产物,首先在静态编译阶段确定类型费时间,而且他这些容器是和迭代器配合起来使用的,这样子也会慢吧。数组则是和指针一起来用的,据说不是很靠谱的说法:在高阶编程语言里面,C/C++的数组与指针的配合使用或许是最快的访问内存的方式了。当然可能会有人说汇编或是机器语言更快的话,那就不是高阶语言的范畴了。
#1
可用enum
#2
class Test
{
public:
Test(){};
enum{size = 5};
int arr[size];
};
#3
看你这size是不是编译期常量了。。。
#4
改用vector
#5
动态的话就用vector吧,C++都实现好了。 自己写没必要。
#6
好吧,我刚好看到 CA2W 这个类的实现,就看到了如何动态确定数组大小的。
不过要用到模板:
template <int TLength = 128>
class Cls
{
private:
int arr[TLength];
};
之所以可以,是因为模板是静态编译时确定的。
不过要用到模板:
template <int TLength = 128>
class Cls
{
private:
int arr[TLength];
};
之所以可以,是因为模板是静态编译时确定的。
#7
new
长度长度长度长度长度
长度长度长度长度长度
#8
不需要自己写,已有std::array
编译器还不支援就去找boost
编译器还不支援就去找boost
#9
哎 为什么还用数组呢 试试vector
#10
enum确实不错,但是有类型上的问题。
#11
你的size在编译阶段是不知道值的,所以不符合数组的声明与定义方式。如果想坚持用数组的话,可以用动态开辟内存空间。int *iptr = new int[size];然后再初始化一下。当然你可以用STL中的容器啊,都是比数组好用的,就是比数组慢些。
#12
class Test
{
public:
Test():size(5){};
const int size;
int arr[]; //就这样不去指定不就行了,用的时候再指定长度。应该可以达到你想要的同样效果
};
{
public:
Test():size(5){};
const int size;
int arr[]; //就这样不去指定不就行了,用的时候再指定长度。应该可以达到你想要的同样效果
};
#13
楼主能说明一下想要的是在编译期决定array的大小还是执行期吧
顺便再说一下编译器,大伙才能决定该用C++98或C++11的解法
顺便再说一下编译器,大伙才能决定该用C++98或C++11的解法
#14
我不想使用不使用vector,第一是因为我实际写的是一个图像处理程序,用vector真心没有使用数组来得
我之前不想使用vector的确是处于效率的考虑,但是我的实际问题是这样的:
我写的是一个图像处理程序,对于每个像素,都会建立大小为5的结构体数组。由于数组的大小比较小,是不是使用vector与直接使用数组差别不大呢?
因为我知道,vector内部也是连续的,如果不停的pushback,当大小不够时会重新分配,但是我这边size是定的,可以在初始化vector时先确定大小,然后就可以避免重新分配造成的效率损失,我的想法对么?
#15
>我写的是一个图像处理程序
强烈推荐openCV2,对图像处理做了很多的优化
他的资料结构也是针对图像处理而设计的
>可以在初始化vector时先确定大小,然后就可以避免重新分配造成的效率损失
正确,vector的初始化你可以这样做
vector<type> A(640 * 480);
>如果不停的pushback,当大小不够时会重新分配
你对于push_back的猜测是正确的
空间不够的时候会重新分配一块更大的空间
强烈推荐openCV2,对图像处理做了很多的优化
他的资料结构也是针对图像处理而设计的
>可以在初始化vector时先确定大小,然后就可以避免重新分配造成的效率损失
正确,vector的初始化你可以这样做
vector<type> A(640 * 480);
>如果不停的pushback,当大小不够时会重新分配
你对于push_back的猜测是正确的
空间不够的时候会重新分配一块更大的空间
#16
这个很长见识啊,谢谢了。这学期我写了好多模板代码,看到您的这个之后我试了试,发现原来模板的东西很多我都还不知道呢。受教了!!!
#17
我看了15L的回答,我想我能说的也许就是那些了。说的很好,补充一下的是:STL中的容器慢的原因吧,这些都是泛型的产物,首先在静态编译阶段确定类型费时间,而且他这些容器是和迭代器配合起来使用的,这样子也会慢吧。数组则是和指针一起来用的,据说不是很靠谱的说法:在高阶编程语言里面,C/C++的数组与指针的配合使用或许是最快的访问内存的方式了。当然可能会有人说汇编或是机器语言更快的话,那就不是高阶语言的范畴了。