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

cpp*_*ame 1 c++ containers stl vector

在下面的代码中,如果我调用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;
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*Łoś 7

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

行为与您预期的相似的方法是reserve():

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


Bat*_*eba 5

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

你应该写v[i] = i.

无论你做什么,不要掉线v.resize(n);并保留你push_back因为内存重新分配而分段调整矢量大小的次优.(虽然好的方法stl可以对这种编程进行优化,但最好不要依赖它).

  • 好吧,用`reserve`替换`resize`也可能是一个选项,可能会导致OP预期的行为. (5认同)