首页 > 解决方案 > 为什么这段代码的向量迭代器没有停止?

问题描述

我是 C++ 的初学者。

当我做运动问题时,我遇到了问题。

在代码下!!

我希望从factors.size()到0。但是,它没有像。它返回给我,从 factor.size() 到 0, -1(4294967295), -2(4294967294), ...

为什么这段代码不返回 0 并且不停止?

如果你知道,请让我解释一下。

    vector<int>::size_type iter;
    for (iter=factors.size()-1 ; iter >= 0 ; --iter)
    {
        //cout << factors[iter];
        cout << iter;
        cout << " : " << factors[iter] << endl;
    }
//----------- Full Code --------------//
#include <iostream>
#include <string>
#include <vector>

using namespace std;

int find_max_bit(int n)
{
    int i = 0;
    int nTmpNum = 0;
    int nMaxJisu = 0;
    int ret = 0;

    nTmpNum = n;
    while (nTmpNum >= 1)
    {
        nMaxJisu++;

        nTmpNum = (int) (nTmpNum / 2);
    }

    ret = (int) nMaxJisu;

    return ret;
}

std::vector<int> binary_factors(int n)
{
    std::vector<int> factors;

    cout << "find_max_bit : " << find_max_bit(n) << endl;

    factors.reserve(find_max_bit(n));

    int bi_Num;
    for (int i = 0; i < find_max_bit(n) ; i++)
    {
        bi_Num = n >> i & 0x1;
        cout << bi_Num;
        factors.push_back(bi_Num);
        cout << " : size : " << factors.size() << endl;
    }

    return factors;
}

int main()
{
    int nNum;

    cin >> nNum;

    while (nNum < 0 || nNum > 31)
    {
        cin >> nNum;
    }


    auto factors = binary_factors(nNum);
   
    cout << "factors.size() = " << factors.size() << endl;

    cout << nNum;
    
    for (auto it = factors.begin(); it != factors.end(); ++it)
        cout << ' ' << *it;
    cout << endl;

    vector<int>::size_type iter;
    for (iter=factors.size()-1 ; iter >= 0 ; --iter)
    {
        //cout << factors[iter];
        cout << iter;
        cout << " : " << factors[iter] << endl;
    }
}

标签: c++

解决方案


这个循环:

for (iter=factors.size()-1 ; iter >= 0 ; --iter)

保证永远不会终止,因为iter,即vector<int>::size_type,是无符号类型。当你从一个无符号的 0 中减去 1 时,你会得到一个很大的正数,而不是一个负数。由于iternever 变为负数,因此永远不会满足循环条件。

您可以通过制作iter一个有符号整数来解决此问题:

for (auto iter = static_cast<int>(factors.size()) - 1 ; iter >= 0 ; --iter)

推荐阅读