我不确定这段代码有什么问题:
std::vector<int> myVector(0);
if (myVector.back() == 12)
myVector.push_back(12);
看起来在空向量上调用back()会导致程序崩溃。
我不明白为什么会崩溃?我们需要在调用back()
之前检查向量的长度吗?或者可能是一个错误吗?
文档说,如果向量为空,则返回一个未定义的值。
我不确定这段代码有什么问题:
std::vector<int> myVector(0);
if (myVector.back() == 12)
myVector.push_back(12);
看起来在空向量上调用back()会导致程序崩溃。
我不明白为什么会崩溃?我们需要在调用back()
之前检查向量的长度吗?或者可能是一个错误吗?
文档说,如果向量为空,则返回一个未定义的值。
在调用back()之前,我们需要检查向量的长度吗?
简单来说:是的。这是你的错误,你的向量是空的,所以没有“back”元素。
文档应该说明(如果它有任何说明),在空向量上调用back()
会导致未定义的行为,而不是返回未定义的值。
back()
的前提条件是你的向量至少有一个元素。这就是接口定义的方式。在尝试调用 back()
之前,您需要确保您的输入符合前提条件。 - CB Baileyc++11标准规定如下:
23.3.2.8 / 3
调用空数组的front()或back()方法是未定义的。
由于行为是未定义的,任何事情都可能发生。你很幸运只是遇到了崩溃。
back()
函数会返回,他们是有权这样做的。如果你正在使用 MSVC++,那么你有权阅读他们的文档。但是,如果没有意识到任何方式中使用“未定义值”可能会导致崩溃,则可能会得到 -1 分。 - Steve Jessopback()
的原因是为了让实现不需要特殊情况下的代码。它们可以选择比它们检查向量是否为空时更快,并在不同情况下执行不同的操作。当您做错事情时,它们容易崩溃(或更糟)。这可能感觉很奇怪,但这是语言设计的一部分所做出的权衡。 - Steve Jessop