背景:
该程序可将一个数字加1到一个 vector 中存储的数字中。

允许将前面带有0的数字作为输入,但不允许作为输出。
例如:0123和123都是有效输入
但是0124是无效的输出
而124是有效输出

问题:
我想使用erase()删除输出 vector 前面的0,直到使用代码底部的while循环找到非零值为止。
但是,编译器将返回垃圾值。另一个在线编译器给出了分段错误。
如果不使用while循环,则其余代码可以正常工作。

#include <iostream>
#include<vector>
using namespace std;
int main()
{
    vector<int> A = { 9, 9, 9 };
    A.insert(A.begin(), 0); /*--last carry may nonzero so new digit -*/
    vector<int>::reverse_iterator it;
    int c = 1;
    for (it = A.rbegin(); it != A.rend(); it++) /*----finds and adds carry---*/
    {
        int d = *it;
        d = d + c;
        c = d / 10;
        if (c == 0)
            *it = d;
        else
        {
            d = d % 10;
            *it = d;
        }

    }
    vector<int>::iterator iss;
    iss = A.begin();

问题循环开始
    while (*iss == 0) /*----------------problem----------------*/
    {
        iss = A.erase(iss);
    }

循环结束
    for (int i = 0; i < A.size(); i++)
    {
        cout << A[i];
    }
}

最佳答案

你写的几乎是正确的。结束迭代器应另外进行检查。

while(iss != A.end() && *iss == 0) {
    iss = A.erase(iss);
}

但是,可以实现它以使算法具有更好的性能:
while(iss != A.end() && *iss == 0) {
    ++iss;
}
A.erase(A.begin(), iss);

关于c++ - 如何在while循环中使用.erase()?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46867496/

10-17 01:29