c++ - 如何在 while 循环中使用 .erase()?

标签 c++

背景: 这是一个程序,用于将存储在 vector 中的数字逐位加 1。

前面有 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/

相关文章:

c++ - 将编译的最小 C++ 程序

c++ - 产生超几何分布的随机变量

c++ - 错误 : type 'std::__1::basic_string<char>' does not provide a call operator

java - 在 Java 中是否有 try/catch 的替代方法来打开文件?

c++ - C 中的结构声明中的冒号是什么意思?

c++ - 使用 WinAPI/C++ 在 Windows 上的进程之间实现多读取器、单写入器同步锁定

c++ - 是否可以查看内置函数定义?

c++ - 内核崩溃 - 无法处理 000002c0 处的内核 NULL 指针取消引用

c++ - boost 正则表达式 : Getting the Named Group

c++ - 如何开发一个将在带有 <OBJECT> 标签的浏览器中执行的 IE 插件