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)
resize确保向量包含确切的n元素,同时push_back将项目附加到vector,因此在调整大小后占用向量的零之后添加nubmers.如果您在向量(< v.size())中打印所有数字而不是第一个,则可以看到它n.
行为与您预期的相似的方法是reserve():
效果:一种指令,通知向量计划的大小更改,以便它可以相应地管理存储分配.后
reserve(),capacity()是大于或等于如果重新分配发生储备的参数; 并等于之前的capacity()其他值 .当且仅当当前容量小于参数时,才会发生重新分配reserve().如果除非由非CopyInsertable类型的move构造函数抛出异常,则不会产生任何影响.(§23.3.6.3/2)
v.push_back(i)使用该向量中最后一个元素的值将向量的大小增加v1 i.这就是为什么10个零保留在向量的开始(即前面).
你应该写v[i] = i.
无论你做什么,不要掉线v.resize(n);并保留你push_back因为内存重新分配而分段调整矢量大小的次优.(虽然好的方法stl可以对这种编程进行优化,但最好不要依赖它).
| 归档时间: |
|
| 查看次数: |
133 次 |
| 最近记录: |