循环没有终止,请有人解释我做错了什么
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_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
}
}
}
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;
我不知道为什么这个循环没有终止。请有人解释。我哪里做错了。
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_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
}
}
}
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;