C ++标准算法中的ForwardIterator和OutputIterator可以相同吗?

时间:2011-08-25 14:36:36

标签: c++ stl undefined-behavior

std::transformstd::partial_sum这样的'流媒体'算法可以读取和写入同一个地方吗?

例如,以下代码在gcc中有效,但我不确定它是否“只是意外”,编译器可以自由地破解代码以优化它。

#include <algorithm>
#include <iostream>
#include <numeric>
#include <vector>

int main()
{
  int arr[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
  std::vector<int> vec(arr, arr + sizeof(arr)/sizeof(arr[0]));
  std::partial_sum(vec.begin(), vec.end(), vec.begin());
  for(std::vector<int>::iterator iter = vec.begin(); iter != vec.end(); iter++)
    std::cout << *iter << std::endl;
  return 0;
}

2 个答案:

答案 0 :(得分:3)

是的,绝对,只要迭代器首先允许读/写(例如,你显然无法从std::cout读取)。一种常见的模式是使用transform来就地修改矢量。

答案 1 :(得分:1)

是的,这样可以正常工作。您将覆盖相同数量的答案元素的来源。

例如,

int square(int x) { return x*x; }
std::transform(vec.begin(), vec.end(), vec.begin(), square);

将vec中的每个数字对齐。