我不明白为什么这两个循环不会给出相同的结果。未注释的循环仅为具有3个元素的多个(即3,6,9等)的向量提供正确的结果,而注释的循环适用于任何大小的向量。
//Find max product of two adjacent elements in vector
int adjacentElementsProduct(std::vector<int> inputArray) {
int maxProduct=0;
for (auto it=inputArray.begin(); it!=inputArray.end(); ++it) {
if ((*it * *++it)>maxProduct)
maxProduct = *it * *++it;
}
// for (int i=0; i<inputArray.size(); ++i) {
// if ((inputArrcay[i] * inputArray[i+1])>maxProduct)
// maxProduct = inputArray[i] * inputArray[i+1];
//
//
// }
return maxProduct;
}
答案 0 :(得分:1)
你的两个循环都有一个过去的读取,这是非常严重的错误。 但是使用迭代器循环,您还有另一个更改结果的错误:
int adjacentElementsProduct(std::vector<int> inputArray) {
int maxProduct=0;
for (auto it=inputArray.begin(); it!=inputArray.end(); ++it) { // INCREMENT
if ((*it * *++it)>maxProduct) // INCREMENT
maxProduct = *it * *++it; // INCREMENT
}
return maxProduct;
}
++它实际上增加了迭代器。因此,您在几个地方递增迭代器,并且可以跳过末尾(如果发生这种情况,它将继续读取,直到发生非常糟糕的事情,因为它是未定义的行为。)即使您没有跳过结束,你最终还是会跳过价值观,这可能就是为什么你会看到不同的结果。您应该使用它+ 1而不是++它,因为它没有推进迭代器的副作用。在最坏的情况下,循环的单次迭代会使迭代器增加三倍。
但是当你取消引用它+ 1时,你仍然可能正在取消引用结束迭代器。因此,您应该稍微改变一下逻辑。另外,通过引用传递向量以避免执行可能昂贵的副本:
int adjacentElementsProduct(std::vector<int> const & inputArray) {
int maxProduct = 0;
if (inputArray.size() > 1) {
for (auto it = ++inputArray.begin(); it != inputArray.end(); ++it) {
int prod = *it * *(it-1);
if (prod > maxProduct) {
maxProduct = prod;
}
}
}
return maxProduct;
}
我更喜欢使用索引变量来实现清洁和简洁。注意,我预先升级了迭代器,然后做了当前项和前一项的产品,而不是当前和下一项。这就是为什么我预先检查了向量中有多个项目。
答案 1 :(得分:0)
DANG你快速使用绿色复选标记。这样做可以阻止答案。
无论如何......他们说了什么。 ...错误的逻辑和索引越界。
注意事项:我正在发布一个完整的程序,所有程序都可以编译和运行。这称为最小,完整,可验证的示例,对于StackOverflow问题,它是 de rigueur 。从现在开始在你的问题中这样做。我通过const引用传递了向量。我将类型从int更改为unsigned,因为这显然是你的意图。 如果值交替正面和负面怎么办?错误,就是这样。我检查了边缘情况,其中没有相邻的值对相乘。抛出异常比返回一个实际上不是两个相邻值的乘积的数字更好,正如所宣传的那样。我使用std :: max来计算最大乘积。
#include <vector>
#include <algorithm>
#include <iostream>
unsigned adjacentElementsProduct(const std::vector<unsigned> &inputArray) {
if (inputArray.size() < 2)
{ throw std::range_error("adjacentElementsProduct vector.size() < 2"); }
unsigned maxProduct= 0u;
for (auto it=inputArray.begin(); it!=inputArray.end()-1; ++it) {
maxProduct = std::max(maxProduct, it[0] * it[1]);
}
return maxProduct;
}
int main() {
std::vector<unsigned> v{ 1,4,0,37,5,2,2,37 };
std::cout << adjacentElementsProduct(v) << '\n';
return 0;
}
答案 2 :(得分:0)
感谢大家!我的最终版本:
#include <iostream>
#include <vector>
int adjacentElementsProduct(std::vector<int> &inputArray) {
int maxProduct=-1000; //Elements of vector cannot be <-1000
if (inputArray.size() >1) {
for (auto it=++inputArray.begin(); it!=inputArray.end(); ++it) {
int p = (*it) * (*(it-1));
if (p>maxProduct)
maxProduct = p;
}
}
return maxProduct;
}
int main(int argc, const char * argv[]) {
std::vector<int> v { 1, -2, 3, -4, 1, -7 };
std::cout << adjacentElementsProduct(v) << std::endl;
}