我对这段代码的结果很疑惑:
std::vector<int> v;
std::cout << (v.end() - v.begin()) << std::endl;
v.reserve(1);
std::cout << (v.end() - v.begin()) << std::endl;
v[9] = 0;
std::cout << (v.end() - v.begin()) << std::endl;
输出:
0
0
0
所以...首先...end()
不指向内部数组的末尾而是最后占用的单元格...好的,这就是为什么结果在 reserve(1)
之后,迭代器减法仍然是 0
。但是,为什么填满一个单元格后还是0
。我期望 1
作为结果,因为 end()
现在应该将迭代器返回到第二个内部数组单元格。
此外,为什么我在使用 v[9] = 0
访问第 10 个单元时没有出现段错误,而 vector 只有 1 个单元长?
最佳答案
首先,end()
为您提供一个指向 vector 中最后一个元素之后的迭代器。如果 vector 为空,则 begin()
除了与 end()
相同之外,不能返回任何其他内容。
然后当你调用reserve()
您实际上并没有创建任何元素,您只是保留了一些内存,因此当您添加元素时 vector 不必重新分配。
最后,当你这样做的时候
v[9] = 0;
您正在索引 vector 越界,这会导致未定义的行为,因为您写入不属于您的内存。 UB 经常会导致崩溃,但实际上并没有,它可能似乎有效,但实际上并没有。
作为最后一部分的注释,the []
operator没有边界检查,这就是为什么它会接受超出范围的索引。如果你想要边界检查,你应该使用 at()
.
关于c++ - 超过 vector 不会导致段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32856925/