1

在下面的代码中,如果我调用 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;
}
4

3 回答 3

7

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

表现如您预期的方法是reserve()

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

于 2013-09-11T08:14:18.893 回答
5

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

你应该改写v[i] = i

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

于 2013-09-11T08:17:00.477 回答
4

vector.resize()

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

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

你的程序正在做你告诉它做的事情。

于 2013-09-11T08:13:59.287 回答