2016-06-09 44 views
0

我需要用特定值填充向量。我发现下面的代码有效,但a.size()未能从0更改。添加调整大小调用后,我把元素需要几乎两倍。看来应该有一个O(1)的方式来更新大小,因为我不需要改变任何元素。在那儿?我应该不打扰吗?std ::向量大小在保留和填充后不会更新

#include <iostream> 
#include <vector> 
#include <math.h> 

using namespace std; 

int main() 
{ 
    int n = 1e9; 
    vector<float> a; 
    a.reserve(n); 
    for (int i=0; i<n; i++) 
    a[i] = i; 

    cout << a[2]; //successfully prints as 1 
    cout << a.size(); //confusingly prints as 0 
} 

编辑:这不是重复的,因为链接的问题没有解决基准问题。它只是要求保留区域的差异和调整大小,这是我没有问的。此代码的工作原理很快,但会产生令尺寸()不正确的丑陋副作用。“

+2

这是* *重复。您的代码已损坏。它现在在你的机器上工作的事实是无关紧要的:你访问单元化内存。 – Ven

回答

2

std::vector::reserve()不适用于创建元素。要创建元素,您可以使用std::vector::resize()

试试这个:

#include <iostream> 
#include <vector> 
#include <math.h> 

using namespace std; 

int main() 
{ 
    int n = 1e9; 
    vector<float> a; 
    a.resize(n); 
    for (int i=0; i<n; i++) 
    a[i] = i; 

    cout << a[2]; 
    cout << a.size(); 
} 
+0

我知道保留区不会创建元素。它可以防止重复调整大小,就像一次重复push_backs一样。你的方法已经发生在我身上,但是我以5.45s而不是3.78为基准来完成同样的事情。 50%的罚款,看起来应该是O(1)? –

+2

@DavidLerner 3.78 for * what *虽然?对于具有未定义行为的破碎代码? – juanchopanza

+0

@juanchopanza代码完成相同的事情。我甚至通过打印'a [2]'来检查输出。 –