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

时间:2018-10-08 02:50:31

标签: c++ set

在调试Node结构时,遇到运行时错误“向量下标超出范围”。我正在使用if语句来测试我的集合parents是否为空,以确定其子项是否“可用”。当它检查设置为空的node的{​​{1}}时,抛出该错误。

isUsable位于Node结构中:

parents

从主叫方:

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;

全部返回相同的错误。我该如何解决此问题,或者还有另一种方法可以检查向量是否为空?

1 个答案:

答案 0 :(得分:0)

允许对数组进行负索引但有一些限制。

例如:

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函数,该函数访问最后一个元素,因此应使用该函数。