以下代码在ideone上运行正常,输出
10000
10000
按预期
但是在我的本地计算机上,输出是排序
9990
9998
所有代码都是创建一个10k int
的向量,并计算其中的0的数量。一旦使用了一个类,一次使用了主。
如果我在调试模式下本地运行代码,则会产生
0
0
我在Windows 7上使用的是带有默认GNU GCC编译器的codeBlocks(虽然它编译C ++,所以我猜它与Linux GCC不同,它只做C)
#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
答案 0 :(得分:2)
方法reserve(..)仅保证分配空间。它不保证向量元素中的值。唯一会发生的事情是你的计数不会崩溃。结果值是依赖于实现/分配/等。
理解容器和迭代器所必需的核心思想是它们与简单数组一样不安全:
char b1[100];
vector<char> b2(100);
void f()
{
char c1 = b1[200];
char c2 = b2[300];
}
在这两种情况下,编译器都会生成代码,这些代码将拾取数组之外的内容。两个示例都会触发未定义的行为也许代码会崩溃,也许不会崩溃。两次访问都同样糟糕。
这种设计的主要原因是速度。访问数组应该很快。这是C / C ++的核心思想。索引的值是程序员的责任。编译器不会检查。无论喜欢与否,都是如此。