Могут ли ForwardIterator и OutputIterator в стандартных алгоритмах C ++ быть одинаковыми? - PullRequest
3 голосов
/ 25 августа 2011

Может ли алгоритм потоковой передачи, например std::transform или std::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 ]

3 голосов
/ 25 августа 2011

Да, безусловно, если итератор разрешает чтение / запись в первую очередь (например, вы явно не можете читать из std::cout).Обычная схема - использование transform для изменения вектора на месте.

1 голос
/ 25 августа 2011

Да, это будет работать нормально.Вы бы перезаписали свой источник для того же количества элементов ответа.

Например,

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

Поставит квадратное число в vec на их место.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...