【问题标题】:C++ vector iteratorC++ 向量迭代器
【发布时间】:2013-12-16 03:35:20
【问题描述】:

我需要一些帮助来了解向量 rvN 发生了什么

这是我的理解:

rvN 是一个包含数字字符 0001 的向量。 在函数Clear() 中,所有前导零都将从向量中删除。迭代器设置为指向最后一个向量元素 (1) 的末尾。

it = 3

*it != 0  (since *it == 1)

rvN.erase(it+1, rvN.end()) ->>> rvN.erase(4,rvN.end()) ?

如何消除所有的零?

for (int i = Number.size() - 1; i >= 0; i--)
    {
        if (Number[i]<'0' || Number[i]>'9')
            break;
        else
            rvN.push_back(Number[i] - '0');
    }
    Clear(rvN);
}

    void LargeNumber::Clear(vector<char>& rvN)
    {
        //Eliminate all leading 0s
        vector<char>::iterator it = rvN.end();
        while (it != rvN.begin())
        {
            it--;
            if (*it != 0)
                break;
        }
        rvN.erase(it + 1, rvN.end());
    }

【问题讨论】:

  • 向量似乎是颠倒的,因此最不重要的值存储在“开始”端。例如。 1234 存储为 { 4, 3, 2, 1 }。大概是“逆向量数”
  • 你看到这段代码工作了吗?描述 it=3 的代码前的块是什么?

标签: c++ vector


【解决方案1】:

从右到左读取数字:

for (int i = Number.size() - 1; i >= 0; i--)

如果“数字”包含“1234”,则读取的第一个数字将是最低有效位,即“4”。然后将它们按读取顺序推送到“rvN”上。结果,rvN 会变成

{ 4, 3, 2, 1 }

或者如果 Number 包含 00005

{ 5, 0, 0, 0, 0 }

所以 Clear 只是从右到左工作,直到找到一个非零,然后修剪数组的背面,只留下正常表示中最右边的数字 (050 -> 50, 005 -> 5 , 500 -> 500)。

【讨论】:

  • 数字是1000。所以如果颠倒过来就是0001。如果是从右到左,那么1之前的零是怎么去掉的?因为它首先达到 1 并跳出 while 循环。我有点困惑。
  • @Justin 他们不是。这才是重点。如果数字是"1000",则零很重要。如果数字是"0001",则反转将是1000,然后循环将迭代四次,保持最后一个测试并因此返回1。将0001 设为rvN 的唯一方法是原始数据为"1000"
  • 稍微编辑了我答案的最后一行。
猜你喜欢
  • 1970-01-01
  • 2013-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-19
  • 2012-06-18
相关资源
最近更新 更多