gpt4 book ai didi

c++ - 以下两种情况之间的初始化 vector v(n)有什么区别

转载 作者:行者123 更新时间:2023-12-02 09:54:45 24 4
gpt4 key购买 nike

我有以下代码,

#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,第一个程序给出输出
0
0
0
0
0
1
2
3
4
5
10

第二个程序给出结果
1
2
3
4
5
5

我不明白为什么 vector 在第一个加倍的大小中初始化0而不是在第二个中初始化

最佳答案

实际上,这些都不符合您想要的(我在这里假设您想要输入的五个元素,仅此而已-这可能是一个无效的假设,但对我来说似乎是个好选择)。

在您的第一个中,您拥有(添加注释以解释发生了什么):

int input,n;       // n has arbitrary value.
cin >> n; // overwritten with 5.
vector<int> v(n); // initial vector has five zeros.

这意味着将使用五个默认构造的条目(假设您输入 n)来创建 vector 。然后,您再插入五个,这就是为什么要得到五个零后跟实际数据的原因。

您的第二个有:
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.

实际上,这是未定义的行为,因为您不知道创建该大小的 vector 时的 n是什么。在您的情况下,它似乎为零,但这只是一个幸运的巧合。

注意上面单词“可能”的使用。虽然很可能会使用任意数量的条目创建 vector ,但未定义的行为恰恰意味着-您根本不应该依赖它。按照权利,它可以很容易地在通过声音系统播放 derisive_laughter.wav时删除所有文件:-)

但是,最可能的情况将是以下情况之一:
  • 可以按照您的想法工作,因为n为零;
  • 它的开头将有一些任意的零,类似于您的第一个代码段;
  • 会导致内存不足异常,因为n很大。或
  • 会导致异常,因为n为负数。


  • 在任何情况下,通常都应该预先分配并设置已经存在的值:
    vector<int> v(2);
    v[0] = 7;
    v[1] = 42;

    是否使用 push_back按需扩展 vector :
    vector<int> v;
    v.push_back(7);
    v.push_back(42);

    关于c++ - 以下两种情况之间的初始化 vector v(n)有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61166321/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com