为什么我的vector <int>不是默认为0?</int>

时间:2015-04-04 06:39:36

标签: c++

以下代码在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

1 个答案:

答案 0 :(得分:2)

方法reserve(..)仅保证分配空间。它不保证向量元素中的值。唯一会发生的事情是你的计数不会崩溃。结果值是依赖于实现/分配/等。

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

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

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

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

这种设计的主要原因是速度。访问数组应该很快。这是C / C ++的核心思想。索引的值是程序员的责任。编译器不会检查。无论喜欢与否,都是如此。