循环没有终止,请有人解释我做错了什么

Loop is not terminating, please someone explain what am doing wrong

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

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()0 时,

vec.size() - 1 将成为最大的 std::vector<int>::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
        }
    }
}

vec.size() returns 一个 unsigned 类型,所以如果 size() 是0. 首先你不需要 - 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