2015-03-30 2 views
3

Я знаю transform алгоритм в C++ - это mutating sequence algorithm. Но я никогда не видел никого, использующего transform с целью изменения последовательности. Всякий раз, когда я ищу пример кода в Интернете, я получаю алгоритм преобразования, используемый аналогично алгоритму for_each.Transform - алгоритм мутационной последовательности

Просьба указать ссылку или пример, где я могу понять характер mutating sequence.

Edit: я получил более запутанным, когда я прошел через This SO question. он говорит for_each является non-modifying sequence алгоритмом. Так Я могу изменить элементы с for_each не структура container.Is предоставленный ответ неверный. Если for_each также может изменить элемент, мы можем заменить for_each на transform, и нет необходимости в алгоритме for_each, за исключением того, что его реализация может быть простой.

ответ

2

Вот простой пример

#include <iostream> 
#include <algorithm> 
#include <iterator> 

int main() 
{ 
    int a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; 

    for (int x : a) std::cout << x << ' '; 
    std::cout << std::endl; 

    std::transform(std::begin(a), std::end(a), std::begin(a), 
        [](int x) { return x * x; }); 

    for (int x : a) std::cout << x << ' '; 
    std::cout << std::endl; 

    return 0; 
} 

Выход

1 2 3 4 5 6 7 8 9 10 
1 4 9 16 25 36 49 64 81 100 

То же самое можно сделать с помощью алгоритма std::for_each

#include <iostream> 
#include <algorithm> 
#include <iterator> 

int main() 
{ 
    int a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; 

    for (int x : a) std::cout << x << ' '; 
    std::cout << std::endl; 

    std::for_each(std::begin(a), std::end(a), 
        [](int &x) { x = x * x; }); 

    for (int x : a) std::cout << x << ' '; 
    std::cout << std::endl; 

    return 0; 
} 

Хотя std::for_each упоминается как не-изменяемые алгоритм, тем не менее в его описании написано

2 Эффекты: Применяется е к результату разыменования каждый итератор в диапазон [первый, последний), начиная с первого и переходя к последнему - 1. [Примечание: Если тип первого удовлетворяет требования изменяемого итератора, е могут применяться непостоянные функции через разыменованного итератор. на конце записку]

так ведь он может быть использован в качестве изменяемого алгоритма.

Оба алгоритма, std::for_each и std::transform, принадлежит к категории операций последовательности без модифицирующих becuase они не изменяют порядок элементов исходной последовательности ..

Кажется, вы смешиваете два понятия:. Изменяемые алгоритмы и без модифицирующего alforithms последовательности :)

+0

Да, ваше последнее заявление решило все мои проблемы. :) – InQusitive

4

алгоритм мутационной последовательности означает, что алгоритм изменит (изменяет) контейнер, в котором он работает. В приведенном ниже примере контейнер foo типа std::vector изменен.

std::string s("hello"); 
std::vector<int> foo; 
std::transform(s.begin(), s.end(), back_inserter(foo), ::toupper); 
std::cout << std::string(foo.begin(), foo.end()); 

output является "HELLO"

Это не возможно с std::for_each


Да, что при условии, ответ звучит правильно для меня. Также проверьте список Nonmodifying Sequence Algorithms и Mutating Sequence Algorithms на C++, чтобы проверить ваши утверждения.

+0

Пожалуйста, проверьте мою редактировать часть. – InQusitive

+0

Проверьте, пожалуйста, править. –

+0

Эти две ссылки недоступны. – InQusitive

Смежные вопросы