在下面的代码中,如果我调用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;
}
答案 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)
调整容器大小,使其包含n个元素。
您正在将其调整为n
(10)。所以现在它有10个0。然后在列表末尾添加10个 more 数字(0到9)(通过push_back()
)。最后,您只打印出仍然全为零的第一个n
(10)。
你的程序正在完成你要告诉它的事情。