c++ - 为什么这段代码的向量迭代器没有停止?
问题描述
我是 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;
}
}
解决方案
这个循环:
for (iter=factors.size()-1 ; iter >= 0 ; --iter)
保证永远不会终止,因为iter
,即vector<int>::size_type
,是无符号类型。当你从一个无符号的 0 中减去 1 时,你会得到一个很大的正数,而不是一个负数。由于iter
never 变为负数,因此永远不会满足循环条件。
您可以通过制作iter
一个有符号整数来解决此问题:
for (auto iter = static_cast<int>(factors.size()) - 1 ; iter >= 0 ; --iter)
推荐阅读
- jquery - 使用 Jquery 删除不匹配的元素
- spring - Spring security - 未调用提供的自定义身份验证
- python - 在 Python 中恢复以前的版本
- asp.net-core-2.0 - 如何使 dot.net 核心应用程序显示错误而不是发出空白的 500 错误页面
- javascript - 如何显示日期取决于从日期
- webpack - Webpack and VueJs CLI v3 – Need relative path for images and web-fonts
- ios - 使用 LaunchImages 和 LaunchScreen 的区别
- java - 使用javamail如何发送整数值0
- ios - 带有自定义 UIButton 的 UIBarButtonItem 在 iOS <= 10 上不可见
- c# - app.config 中的错误