首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么这个代码的向量迭代器没有停止?

为什么这个代码的向量迭代器没有停止?
EN

Stack Overflow用户
提问于 2020-06-26 22:55:10
回答 2查看 69关注 0票数 1

我是c++的初学者。

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

按密码!!

我期望从factors.size()到0。但是,这不像。它返回我,从factors.size()到0,-1(4294967295),-2(4294967294),.

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

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

代码语言:javascript
复制
    vector<int>::size_type iter;
    for (iter=factors.size()-1 ; iter >= 0 ; --iter)
    {
        //cout << factors[iter];
        cout << iter;
        cout << " : " << factors[iter] << endl;
    }
代码语言:javascript
复制
//----------- 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;
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-06-26 22:59:46

这个循环:

代码语言:javascript
复制
for (iter=factors.size()-1 ; iter >= 0 ; --iter)

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

您可以通过使iter成为一个有符号整数来解决这个问题:

代码语言:javascript
复制
for (auto iter = static_cast<int>(factors.size()) - 1 ; iter >= 0 ; --iter)
票数 0
EN

Stack Overflow用户

发布于 2020-06-26 23:23:44

问题是,vector<int>::size_type是一个无符号整数,而且您正在向后迭代,就好像它是有符号整数一样。您的第一个期望是正确的,即它将从

假定

factors.size()-1到0假设factors.size() >0

但是,当iter在语句for (iter=factors.size()-1 ; iter >= 0 ; --iter)中达到0时,条件iter >= 0将为真,从而导致语句--iter发生。这将导致iter下垂,并等于该无符号类型的最大可表示值(在您的示例中为4294967295 )。重要的是,iter不会变成负值,循环继续并调用未定义的行为,因为它通过语句factors[iter]访问超出边界的内存。

以下是解决这个问题的两种方法。

如果需要索引,则

  1. 将for循环条件更改为

for (auto iter=factors.size(); iter--;)

如果您只需要该值,则可以使用反向迭代器。

for (auto iter=factors.rbegin(); iter != factors.rend(); ++iter)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62603926

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档