循环没有终止,请有人解释做错了啥[重复]
Posted
技术标签:
【中文标题】循环没有终止,请有人解释做错了啥[重复]【英文标题】:Loop is not terminating, please someone explain what am doing wrong [duplicate]循环没有终止,请有人解释做错了什么[重复] 【发布时间】:2022-01-24 02:07:39 【问题描述】:我不知道为什么这个循环没有终止。请有人解释。我做错了什么。
std::vector<int> vec;
int result0;
for (unsigned i = 0; i < vec.size() - 1; i++)
for (unsigned j = i + 1; j < vec.size(); j++)
result += vec.at(i) * vec.at(j);
std::cout << result;
我想找出向量中整数对的乘积之和。例如:对于1, 2, 3
,result
应该是(1 * 2) + (1 * 3) + (2 * 3)
,它工作正常。但是对于像vector为空这样的边缘情况,它不会显示结果,而是永远运行。
【问题讨论】:
打印vec.size() - 1
,你可能会得到惊喜!这是巨大,因为size_t
0 - 1
成为unsigned
size_t
可能的最大值。
【参考方案1】:
vec.size()
返回一个 unsigned 类型,因此如果 size()
为 0,size() - 1
将返回一个非常大的值。您首先不需要 - 1
,因为您的内部循环已经处理了整数对不可相乘的边缘情况。
您也不需要vec.at(index)
的开销,因为您的循环会自行进行足够的边界检查,因此您可以改用vec[index]
。
试试这个:
std::vector<int> vec;
int result0;
for (size_t i = 0; i < vec.size(); ++i)
for (size_t j = i + 1; j < vec.size(); ++j)
result += vec[i] * vec[j];
std::cout << result;
Online Demo
【讨论】:
【参考方案2】:vec.size() - 1
当vec.size()
是0
时,就像在你的示例中一样,将成为可能的最大std::vector<int>::size_type
(size_t
)。 size_t
是 unsigned
,因此负值“环绕”以从最大的正值开始。
一种可能的解决方法是在循环之前检查vec
是否为空:
if (!vec.empty())
for (unsigned i = 0; i < vec.size() - 1; i++)
for (unsigned j = i + 1; j < vec.size(); j++)
result += vec[i] * vec[j]; // no need for bounds checking here
【讨论】:
以上是关于循环没有终止,请有人解释做错了啥[重复]的主要内容,如果未能解决你的问题,请参考以下文章
“找不到适合 jdbc:sqlite 的驱动程序”问题。我究竟做错了啥?