【问题标题】:iterators for std::accumulatestd::accumulate 的迭代器
【发布时间】:2019-07-07 01:18:56
【问题描述】:

错误似乎与std:: accumulate() 或迭代器有关,还是我访问的指针无效?

int m = 0;
std::vector<int> v{4,-3,0,-5};
for(std::vector<int>::iterator i = v.begin(); i != v.end(); i++)
{
    for(std::vector<int>::iterator j = v.begin(); j != v.end(); j++)
    {
        m = max( m,  std::accumulate(i, j, 0)  );
    }
}

我试过上面的代码,但程序意外停止。

【问题讨论】:

  • 顺便说一句,可以(并且应该)将代码从 O(n³) 简单地更改为 O(n²)。使用 O(n) 空间(覆盖 v 或额外),甚至 O(n) 也是可能的。
  • @JeJo 我回滚了您的编辑,因为它改变了被询问的 OP 原始代码的语义。清理某人的格式是可以的,但不要更改某人代码的逻辑以使其工作方式不同,尤其是在问题中。
  • @RemyLebeau 认为,忽略(OP)main() 是显而易见的,并且不会改变他所要求的任何特别之处。抱歉,如果我的编辑具有误导性。感谢您的回复。

标签: c++ c++11


【解决方案1】:

问题是j 可以小于i。这个版本有效

int m = 0;
std::vector<int> v{4,-3,0,-5};
for(std::vector<int>::iterator i = v.begin(); i!=v.end(); i++)
{
    for(std::vector<int>::iterator j = i; j!=v.end(); j++)
    //                             ^^^^^^
    {
        m = max( m,  std::accumulate(i, j, 0)  );
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-05
    • 2022-01-23
    相关资源
    最近更新 更多