0

这是我第二次使用 C++,我正在尝试移植一些我制作的 Java 代码,但无法理解某些行为。我有一个数据列表,想要创建另一个相同大小的列表,但值默认为零(在Arrays.fill(list, 0);创建它后使用的 Java 中)。当我尝试在 C++ 中做类似的事情时,我得到了variable-sized object 'list1' may not be initialized

这是一个更好的示例代码:

#include <iostream>
#include <boost/assign/std/vector.hpp> // for 'operator+=()'

using namespace std;
using namespace boost::assign;

int main()
{
    cout << "Hello World!" << endl;
    vector<short> data;
    data += -40, -30,-10, 20, 50;

    //int coeff [data.size()];
    cout << "data array size is " << data.size() << endl;
    short list1 [data.size()] = {0}; //does not work
    for (int i =0; i<data.size(); i++) {
        cout << "data is " << list1[i] << endl;
    }

    cout << "********** try 2 **************" << endl;
    //this works if I use a actual number to create the list but I want to declare it at runtime
    short list2 [5] = {0};
    for (int ii=0;ii<5;ii++) {
        cout << "data is " << list2[ii] << endl;
    }


    return 0;
}

就像我提到的,当我谈到 C++ 时,我完全是绿色的(我读过一本书并完成了一些教程),所以我可能会做一些完全错误的事情。如果我不能在运行时并且只能在编译时执行此操作,是否还有其他方法可以用来获得相同的结果?

4

3 回答 3

5

c++ 没有动态大小的数组,所以这是非法的:

short list1 [data.size()];

但您可以使用向量:

std::vector<short> list1(data.size(),0); 

这将创建一个长度与 相同的向量,其中data全是零。

于 2012-05-11T16:53:36.047 回答
2

C++ 向量的等价物Arrays.fill(list, 0);看起来像std::fill(list.begin(), list.end(), 0);

您也可以简单地声明 astd::vector<short> list1(data.size());以使用零初始化值或特定值创建它std::vector<short> list1(data.size(), 0);

于 2012-05-11T17:03:06.800 回答
2

如果您想要一个大小在运行时确定的数组,则必须分配它。

short * list1 = new short[data.size()];
//do stuff
delete [] list1; //we don't want to leak

您通常希望尽可能避免使用裸指针,因此更简洁的解决方案是 juanchopanza 建议的并尝试使用 std::vector。

于 2012-05-11T16:58:19.167 回答