循环没有终止,请有人解释做错了啥[重复]

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, 3result 应该是(1 * 2) + (1 * 3) + (2 * 3),它工作正常。但是对于像vector为空这样的边缘情况,它不会显示结果,而是永远运行。

【问题讨论】:

打印vec.size() - 1,你可能会得到惊喜!这是巨大,因为size_t 0 - 1 成为unsignedsize_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() - 1vec.size()0 时,就像在你的示例中一样,将成为可能的最大std::vector&lt;int&gt;::size_type (size_t)。 size_tunsigned,因此负值“环绕”以从最大的正值开始。

一种可能的解决方法是在循环之前检查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
        
    

【讨论】:

以上是关于循环没有终止,请有人解释做错了啥[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Amazon S3 存储桶策略,我做错了啥?

我在 Swinject 中做错了啥?

CSS标题导航UL / LI链接......我做错了啥?

“找不到适合 jdbc:sqlite 的驱动程序”问题。我究竟做错了啥?

绘图覆盖,所以在 R 循环结束时,都从列表的最后一个元素中拉出。我究竟做错了啥?

在 Perl 中近似 pi - 我做错了啥?