有人可以解释为什么这段代码片段会在循环中运行一次然后给出断言失败表达式:向量迭代器不可递增吗?
for (auto an = a.rbegin(); an != a.rend(); ++an, indexA--) //first number
{
for (auto bn = b.rbegin(); bn != b.rend(); ++bn) //second number
{
if (*an - *bn >= 0)
{
returnVal.push_back(*an - *bn);
a.pop_back();
b.pop_back();
}
else
{
brrow = *an + 10;
a.at(indexA - 1) = a.at(indexA - 1) - 1; // remove 1 from the spot ahead of current digit
returnVal.push_back(brrow - *bn);
a.pop_back();
b.pop_back();
}
}
}
答案 0 :(得分:1)
根据您的评论,您似乎希望同时遍历两个迭代器范围 - 只需要一个for
循环,如下所示:
auto an = a.rbegin();
for (auto bn = b.rbegin();
an != a.rend() && bn != b.rend();
++an, ++bn, indexA--)
if (*an - *bn >= 0)
returnVal.push_back(*an - *bn);
else
{
brrow = *an + 10;
--(a.at(indexA - 1)); // remove 1 from the spot ahead of current digit
// shouldn't you check for rend() first????
returnVal.push_back(brrow - *bn);
}
请注意,两个迭代器都可以声明为for
- 循环本地如果你知道它们的类型完全相同:
for (auto an = a.rbegin(), bn = b.rbegin(); ...
答案 1 :(得分:0)
pop_back()会使你的迭代器无效。
下面详细解释(Does pop_back() really invalidate *all* iterators on an std::vector?):
以下是您的回答,直接来自The Holy Standard:
23.2.4.2 向量满足容器和可逆容器的所有要求(在23.1中的两个表中给出)和 序列,包括大多数可选的序列要求 (23.1.1)。
23.1.1.12 表68表达式。 pop_back()返回typevoid操作语义。擦除( - a.end()) containervector ,list,deque
请注意 a.pop_back相当于a.erase( - a.end())。看看矢量 擦除细节:
23.2.4.3.3 - 迭代器擦除(迭代器位置) - 效果 - 在擦除点之后使所有迭代器和引用无效
因此,一旦调用pop_back,任何迭代器都会先前调用
更多信息:常见问题解答"迭代器失效规则": Iterator invalidation rules