mav*_*.01 2 c++ for-loop vector infinite-loop implicit-conversion
如果输入数组为空,则array.size()应该为 0。第一个for,从0到array.size() - 1,应该意味着它从0到-1,对吗?
for那么,不应输入此值,并且该函数应返回 inversionsCounter 值,该值将是0
但这并没有发生,代码进入了无限循环。为什么是这样?
这是代码:
#include <vector>
#include <iostream>
using namespace std;
int countInversions(vector<int> array)
{
int inversionsCounter = 0;
for (int i = 0; i < array.size() - 1; ++i)
for (int j = i + 1; j < array.size(); ++j)
if (array[i] > array[j])
++inversionsCounter;
return inversionsCounter;
}
int main()
{
vector<int> array = {};
cout << array.size();
cout << countInversions(array);
}
Run Code Online (Sandbox Code Playgroud)
size类模板的成员函数的返回值的类型std::vector是无符号整数类型,通常等同于类型size_t。
所以在for循环的条件下
for (int i = 0; i < array.size() - 1; ++i)
Run Code Online (Sandbox Code Playgroud)
由于通常的算术转换,表达式的两个操作数
i < array.size() - 1
Run Code Online (Sandbox Code Playgroud)
转换为与 type 对应的无符号整数类型std::vector<int>::size_type。因此,当成员函数返回 0时,表达式array.size() - 1将转换为该类型的最大值。size
这是一个演示程序。
#include <iostream>
#include <iomanip>
int main()
{
std::cout << size_t( -1 ) << '\n';
std::cout << std::boolalpha << ( 0 < size_t( -1 ) ) << '\n';
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它的输出是
18446744073709551615
true
Run Code Online (Sandbox Code Playgroud)
所以当成员函数size返回 0 时,你实际上有一个像这样的循环
for (int i = 0; i < 18446744073709551615; ++i)
Run Code Online (Sandbox Code Playgroud)
int您至少应该使用size_t索引类型来代替类型。外循环应该是这样的
for ( size_t i = 0; i < array.size(); ++i )
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
221 次 |
| 最近记录: |