2012-08-05 47 views
0

我不知道我需要一个矢量,但我不认为我可以使用数组,因为我没有固定的大小。给矢量成员和更新元素的默认值

我有一个Singleton类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?这对于一个数组来说会更容易一些,比如samples[2] = 3;,但问题是我不知道在调用getSamples方法之前vector/array的长度。我不认为不断迭代是一个好主意,因为numberOfSamples可能相当大,并且可能需要将每个值更新为五次。

+0

你不需要'return'语句吗? – Vlad 2012-08-05 19:31:06

+0

是的,我正在写一个简化版本的方法,并忘记了返回语句 – networkprofile 2012-08-05 19:35:40

回答

4

你可以简单地resize的载体,这将INITIALISE值(默认为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; 
+0

我不知道C数组符号是可能的。如果大小基本为0,调整大小是否也适用? (当矢量仍为空时) – networkprofile 2012-08-05 19:40:34

+0

'矢量'值初始化,而不是默认初始化。如果是后者,POD类型将保持未初始化。 – ildjarn 2012-08-05 19:43:38

+0

@ildjarn:谢谢。语言失败。 :) – bitmask 2012-08-05 19:44:29

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; }