【问题标题】:Loop is not terminating, please someone explain what am doing wrong [duplicate]循环没有终止,请有人解释做错了什么[重复]
【发布时间】:2022-01-24 02:07:39
【问题描述】:

我不知道为什么这个循环没有终止。请有人解释。我做错了什么。

std::vector<int> vec{};
int result{0};

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 成为unsignedsize_t 可能的最大值。

标签: c++ loops vector


【解决方案1】:

vec.size() 返回一个 unsigned 类型,因此如果 size() 为 0,size() - 1 将返回一个非常大的值。您首先不需要 - 1 ,因为您的内部循环已经处理了整数对不可相乘的边缘情况。

您也不需要vec.at(index) 的开销,因为您的循环会自行进行足够的边界检查,因此您可以改用vec[index]

试试这个:

std::vector<int> vec{};
int result{0};

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
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2018-09-30
      • 2012-07-25
      • 2021-07-02
      • 1970-01-01
      • 2015-10-16
      • 1970-01-01
      • 1970-01-01
      • 2017-06-25
      • 1970-01-01
      相关资源
      最近更新 更多