向量迭代器无法按预期工作(THREAD 1 BAD_EXEC错误)

时间:2018-03-31 22:24:18

标签: c++

我不明白为什么这两个循环不会给出相同的结果。未注释的循环仅为具有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;
}

3 个答案:

答案 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;
}