0

このためのベクトルが必要かどうかはわかりませんが、サイズが固定されていないため、配列を使用できるとは思いません。

Songメンバーvector<float> samples;とメソッドを持つシングルトンクラスがあります。getSamples(int numberOfSamples)このメソッドが呼び出されたときに、ベクトルを正しいサイズ(に基づくnumberOfSamples)にし、その値の一部をおそらく複数回更新したいと思います。

vector<float> &Song::getSamples(int numberOfSamples){
    for(int i = 0; i < numberOfFrames; i++)
        this->samples.push_back(0);
}

たとえば、3番目の値を0ではなく3に変更するにはどうすればよいですか?これは、配列を使用するとはるかに簡単になりますsamples[2] = 3;が、問題は、getSamplesメソッドが呼び出される前にベクトル/配列の長さがわからないことです。numberOfSamplesまた、が非常に大きくなる可能性があり、各値を最大5回更新する必要がある可能性があるため、常に反復することは良い考えではないと思います。

4

2 に答える 2

3

ベクトルのサイズを変更するだけで、すべての新しい値が初期化されます(デフォルトはの値T()になります)。0.0float

vector<float> &Song::getSamples(int numberOfSamples){
    this->samples.resize(this->samples.size() + numberOfFrames);
    // did you mean numberOfSamples instead of numberOfFrames, there?
}

特定のインデックスに値を設定するには、プレーンなC配列の場合と同じように添え字演算子を使用できます。

this->samples[2] = 3;
于 2012-08-05T19:25:52.307 に答える
0

ルックアップテーブルはどうですか?このようなもの:

static const float data[5] = { 0.0, 1.5, -8.25, 10.0, Inf };

samples.reserve(samples.size() + numberOfFrames);   // don't forget this!!

for (unsigned int i = 0; i != numberOfFrames; ++i)
{
    samples.push_back(data[i % 5]);
}

それ以外の場合、ほとんどの要素が同じである場合は、異なる要素を変更するだけです。

samples.resize(samples.size() + numberOfFrames, 25.5f);  // set default to 25.5
for (unsigned int i; i < numberOfSamples; i += 3) { samples[i] = 3.0f; }
于 2012-08-05T19:23:48.840 に答える