[英]What is the difference in initializing vector v(n) between the following two cases
我有以下一段代码,
#include <iostream>
#include <vector>
using namespace std;
int main()
{
int input,n;
cin >> n;
vector<int> v(n);
for(int i=0;i<n;i++){
cin>>input;
v.push_back(input);
}
for(int i=0; i<v.size();i++){
cout << v[i] << endl;
}
cout << v.size() << endl;
return 0;
}
和
#include <iostream>
#include <vector>
using namespace std;
int main()
{
int input,n;
vector<int> v(n);
cin >> n;
for(int i=0;i<n;i++){
cin>>input;
v.push_back(input);
}
for(int i=0; i<v.size();i++){
cout << v[i] << endl;
}
cout << v.size() << endl;
return 0;
}
对于以下输入, n=5, 1 2 3 4 5
,第一个程序给出 output
0
0
0
0
0
1
2
3
4
5
10
第二个程序给出了结果
1
2
3
4
5
5
我不明白为什么向量在第一次将大小加倍时初始化 0,但在第二次中却没有
实际上,这些都不适合您想要的(我在这里假设您想要输入的五个元素,仅此而已 - 这可能是一个无效的假设,但对我来说似乎是一个不错的选择)。
在您的第一个中,您有(添加评论以解释正在发生的事情):
int input,n; // n has arbitrary value.
cin >> n; // overwritten with 5.
vector<int> v(n); // initial vector has five zeros.
这意味着您的向量将由五个(假设您为n
输入)默认构造的条目创建。 然后你 go 并再插入五个,这就是为什么你得到五个零,后面跟着你的实际数据。
你的第二个有:
int input,n; // n has arbitrary value.
vector<int> v(n); // initial vector of that arbitrary value (probably).
cin >> n; // overwritten with five but it's too late anyway.
这实际上是未定义的行为,因为您不知道创建该大小的向量时n
将是什么。 在您的情况下,它似乎为零,但这只是一个幸运的巧合。
请注意上面“可能”一词的使用。 虽然很可能会使用任意数量的条目创建向量,但未定义的行为恰恰意味着 - 您根本不应该依赖它。 按理说,它可以很容易地在通过您的音响系统播放derisive_laughter.wav
时删除您的所有文件:-)
然而,最可能的情况将是以下情况之一:
n
为零;n
大得离谱; 或者n
是负数。无论如何,您通常应该预先分配并设置已经存在的值:
vector<int> v(2);
v[0] = 7;
v[1] = 42;
或不预分配,使用push_back
按需扩展向量:
vector<int> v;
v.push_back(7);
v.push_back(42);
希望,可以通过以下方式编写问题中编写程序的第一种情况以获得正确的结果
1
2
3
4
5
5
对于问题中给出的输入
#include <iostream>
#include <vector>
using namespace std;
int main()
{
int n;
cin>>n;
vector<int> v(n);
for(int i=0;i<n;i++){
cin>>v.at(i);
}
for(int i=0;i<v.size();i++){
cout << v[i] << endl;
}
cout << v.size() << endl;
return 0;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.