运行时错误:矢量下标超出范围:正在检查空集

RunTime Error: Vector Subscript Out of Range: Checking Empty Set

本文关键字:空集 范围 检查 下标 运行时错误      更新时间:2023-10-16

在调试我的 Node 结构期间,我遇到了运行时错误"矢量下标超出范围"。我正在使用 if 语句来测试我的设置parents是否为空,以确定其子项是否"可用"。当它检查设置了空parentsnode时,将引发错误。

isAvailableable 位于 Node 结构中:

bool isUsable() {
if (parents.size() == 0) //<-- Error here
return false;
else
return true;
}

主打来电话:

for (int c = 0; c < nodes.size(); c++) {
if (!nodes[c]->isUsable()) {
nodes[c]->setParent(*nodes[-1]);
}
}

相关声明:

vector<Node*> nodes;
set<Node*> parents;

我试过使用:

parents.size() == 0
!parents.empty()
parents.begin() == parents.end()

都返回相同的错误。如何解决此问题,或者是否有其他方法可以检查向量是否为空?

允许数组的负索引,但有一些限制。

例如:

std::vector<int> vectInt = {12, 23, 34, 45};
int x = vectInt [-1]; // invalid; out of range 

但这没关系:

std::vector<int> vectInt = {12, 23, 34, 45};
int* p = &vectInt[1];
int x = p[-1]; // valid:  accesses arr[0]

来自CPP标准工作草案(N4713(:

11.3.4 数组 [dcl.array]
...
注意:除非已为类声明,否则下标运算符 [] 的解释方式为 E1[E2] 与 *((E1(+(E2(( 相同。由于适用于 + 的转换规则,如果 E1 是数组,E2 是整数,则 E1[E2] 是指 E1 的第 E2 个成员。因此,尽管其外观不对称,但下标是一种交换操作。—尾注 ]

下标运算符[]是为vector定义的。由于vector类定义了访问最后一个元素的back函数,因此您应该使用它。