在C ++中调用STL向量上的resize()时出现意外结果

时间:2013-09-11 08:12:20

标签: c++ vector stl containers

在下面的代码中,如果我调用v.resize(n),程序将打印出 0 0 0 0 0 0 0 0 0 0 ,这不是我想看到的。但是,如果我对包含v.resize(n)的行进行注释,它将打印出 0 1 2 3 4 5 6 7 8 9 ,这是我想要看到的。为什么会这样?我的逻辑在这里出了什么问题?

#include <iostream>
#include <vector>

using namespace std;

int main( int argc , char ** argv )
{
    int n = 10;
    vector<int> v;
    v.resize(n);

    for( int i=0 ; i<n ; i++ )
    {
        v.push_back(i);
    }

    for( int i=0 ; i<n ; i++ )
    {
        cout << v[i] << " ";
    }

    cout << endl;

    return 0;
}

3 个答案:

答案 0 :(得分:7)

resize确保向量包含完全n元素,而push_back将项目附加到vector,因此在调整大小后占用向量的零后添加nubmers。如果您打印向量中的所有数字(< v.size())而不是第一个n,则可以看到它。

行为与您预期的一样reserve()

  

效果:一个指令,通知向量计划的大小更改,以便它可以相应地管理存储分配。在reserve()之后,如果重新分配发生,capacity()大于或等于保留的参数;并等于之前的值   否则capacity()。当且仅当当前容量小于reserve()的参数时,此时才会重新分配。如果除非由非CopyInsertable类型的move构造函数抛出异常,则不会产生任何影响。 (§23.3.6.3/2

答案 1 :(得分:5)

v.push_back(i)将向量v的大小增加1,i是该向量中最后一个元素的值。这就是为什么10个零保留在向量的开始(即前面)。

您应该改为编写v[i] = i

无论你做什么,都不要放弃行v.resize(n);并保留你的push_back,因为内存重新分配,因为它不是最佳的分段调整矢量大小。 (虽然好的stl会对这种编程进行优化,但最好不要依赖它。

答案 2 :(得分:4)

vector.resize()

  

调整容器大小,使其包含n个元素。

您正在将其调整为n(10)。所以现在它有10个0。然后在列表末尾添加10个 more 数字(0到9)(通过push_back())。最后,您只打印出仍然全为零的第一个n(10)。

你的程序正在完成你要告诉它的事情。