0

C ++を使用するのはこれが2回目で、作成したJavaコードを移植しようとしていますが、動作を理解するのに問題があります。データのリストがあり、同じサイズの別のリストを作成したいのですが、値はデフォルトでゼロになっています(JavaではArrays.fill(list, 0);作成後に使用します)。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

実行時にサイズが決定される配列が必要な場合は、それを割り当てる必要があります。

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 に答える
2

Arrays.fill(list, 0);C++ベクトルに相当するものは次のようになりますstd::fill(list.begin(), list.end(), 0);

を宣言するだけstd::vector<short> list1(data.size());で、初期化された値がゼロまたは特定の値で作成することもできます。std::vector<short> list1(data.size(), 0);

于 2012-05-11T17:03:06.800 に答える