gpt4 book ai didi

c++ - 具有 pop_back 函数的类模板 vector 无法按预期工作

转载 作者:行者123 更新时间:2023-11-27 22:44:59 24 4
gpt4 key购买 nike

#include <iostream>
#include <vector>

using namespace std;

int main(){

vector<int> VectorName;

VectorName.push_back(2);
VectorName.push_back(3);

cout << VectorName[1] << endl;

VectorName.pop_back();

cout << VectorName[1] << endl;

}

在我的理解中,pop_back() 应该弹出 vector 的最后一个索引,而我期望的编译结果是给我一个错误;然而,控制台上的输出如下:

3 3

谁能解释一下为什么这个程序编译成功了?

谢谢。

最佳答案

vector<>::operator[]()不检查 vector 的大小,因此您的代码会产生未定义的行为。

在您的特定情况下, vector 的大小( vector 中的项目数)正在缩小,但容量(底层数组的大小)没有当你调用pop_back() .这意味着第二个 VectorName[1]指向未使用但存在的内存。例如,如果我们稍微编辑您的示例以检查容量和大小:

#include <iostream>
#include <vector>

using namespace std;

int main(){

vector<int> VectorName;

VectorName.push_back(2); // |[2]|
VectorName.push_back(3); // |[2, 3]|

VectorName.pop_back(); // |[2], 3|

cout << VectorName.size() << endl;
cout << VectorName.capacity() << endl;

}

输出是:

1

2

您可以在此处查看工作示例:http://coliru.stacked-crooked.com/a/70d5141bdc375b48

如您所见, vector 的大小是正确的(1 项​​),但是对 VectorName.pop_back() 的调用不会降低容量,所以 3仍然存在于 vector 中,但无法访问。

通过调用 VectorName.pop_back() 后访问第二项,你正在导致未定义的行为。在您的情况下,您会得到 3 ,但使用不同的编译器、体系结构或机器编译应用程序可能会导致您的应用程序崩溃(或更糟)!

使用 vector<int>::at() , 而不是 vector<int>::operator[]()会抛出 std::out_of_range异常,导致你的程序崩溃。这是因为 at()函数检查 vector 的大小并在您尝试访问 vector 中的越界位置时抛出异常。也就是说,不要依赖 at()函数来检查你的 vector 访问,更喜欢检查 size()调用前 vector 的 VectorName[1] .

例如,通过再次对您的代码进行小幅修改,我们可以看到当我们使用 at() 时会发生什么。功能:

#include <iostream>
#include <vector>

using namespace std;

int main(){

vector<int> VectorName;

VectorName.push_back(2);
VectorName.push_back(3);

cout << VectorName.at(1) << endl;
VectorName.pop_back();

cout << VectorName.at(1) << endl;

return 0;
}

3

terminate called after throwing an instance of 'std::out_of_range'

what(): vector::_M_range_check: __n (which is 1) >= this->size() (which is 1)

bash: line 7: 4793 Aborted (core dumped) ./a.out

实例:http://coliru.stacked-crooked.com/a/8226be85196f54fe


关于“编译错误”的额外内容。编译器不会在您访问它之前尝试检查 vector 的大小,因此编译器会愉快地编译您的代码而不会出现错误或警告。作为开发者,您有责任对您的代码执行边界检查。

关于c++ - 具有 pop_back 函数的类模板 vector 无法按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44251392/

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