gpt4 book ai didi

c++ - 为什么我的 vector 不默认为 0?

转载 作者:行者123 更新时间:2023-11-28 02:29:18 25 4
gpt4 key购买 nike

下面的代码在 ideone 上运行良好,输出为

10000
10000

如预期的那样

但是在我的本地机器上,输出是这样的

9990
9998

所有代码所做的就是创建一个包含 10k 个 int 的 vector 并计算其中 0 的数量。一次使用一个类,一次在 main 中。

如果我在 Debug模式下在本地运行代码,结果是

0
0

我在带有默认 GNU GCC 编译器的 Windows 7 上使用 codeBlocks(尽管它编译 C++,所以我猜它与只编译 C 的 Linux GCC 不同)

#include<iostream>
#include<vector>
using namespace std;
class vecttest
{
vector<int> vect;
public:
vecttest()
{
vect.reserve(10000);
}
int zcount()
{
int count=0;
for(int i=0;i<10000;i++)
{
if(vect[i]==0)
count++;
}
return count;
}
};
int main()
{
vecttest v;
cout<<v.zcount();

vector<int> v2;
v2.reserve(10000);
int count=0;
for(int i=0;i<10000;i++)
{
if(v2[i]==0)
count++;
}
cout<<endl<<count;
}

ideone 链接:http://ideone.com/q1XRvQ

最佳答案

reserve(..) 方法只保证空间被分配。它不保证 vector 元素中的值。唯一会发生的事情是您的计数不会崩溃。结果值取决于实现/分配/等。

了解容器和迭代器所必需的核心思想是它们与简单数组一样不安全:

char b1[100];
vector<char> b2(100);

void f()
{
char c1 = b1[200];
char c2 = b2[300];
}

在这两种情况下,编译器都会生成代码来获取数组之外的内容。这两个示例都会触发未定义的行为。也许代码会崩溃,也许不会。两种访问都同样糟糕。

这样设计的主要原因是速度。访问数组应该很快。这是C/C++的核心思想。索引的值是程序员的责任。编译器不会检查。不管你喜不喜欢,就是这样。

关于c++ - 为什么我的 vector<int> 不默认为 0?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29443533/

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