przejście do zawartości
zpr c++ quick reference
Narzędzia użytkownika
Zarejestruj się!
Zaloguj
Narzędzia witryny
Narzędzia
Pokaż stronę
Poprzednie wersje
Odnośniki
Ostatnie zmiany
Menadżer multimediów
Indeks
Zaloguj
Zarejestruj się!
Ostatnie zmiany
Menadżer multimediów
Indeks
Ślad:
•
stable_sort
generate_generate_n
Ta strona jest tylko do odczytu. Możesz wyświetlić źródła tej strony ale nie możesz ich zmienić.
===== Szablony generate i generate_n ===== Szablony ''generate'' i ''generate_n'' pozwalają przypisać wartości zwracane przez //generator// do elementów tablicy lub kontenera udostępniającego iterator. Są szczególnie przydatne wtedy, gdy kontener chcemy wypełnić zgodnie z jakąś zależnością funkcyjną. Można z nich również korzystać w celu przypisania kolejnym elementom losowych wartości.\\ Generatorem może być bezargumentowa funkcja lub //obiekt funkcyjny//((//obiekt funkcyjny//, //funktor// - obiekt udostępniający metodę ''operator()'')), zwracający obiekty takiego samego typu, jak przechowywane w kontenerze. ===== generate ===== ==== Deklaracja ==== <code cpp> #include <algorithm> // tu jest definicja szablonów generate i generate_n template <class ForwardIterator, class Generator> void generate ( ForwardIterator first, ForwardIterator last, Generator gen ) </code> ==== Działanie ==== ''generate'' przypisuje wartość zwracaną przez kolejne wywołania ''gen'' począwszy od elementu ''first'' (włącznie z ''first'') skończywszy na ''last'' (bez ''last''). Pozwala więc w intuicyjny sposób przypisać wartości elementom należącym do kontenera. ==== Parametry ==== * ''first'' - iterator pierwszego elementu kontenera * ''last'' - iterator elementu za ostatnim w kontenerze * ''gen'' - bezargumentowa funkcja lub funktor zwracająca obiekty typu przechowywanego przez kontener; wartość zwracana przez jej kolejne wywołania jest przypisywana kolejnym elementom. ==== Krótki przykład ==== <code cpp> /* Wypełnia wektor "losowymi" wartościami */ int random() { return 4; } //patrz http://www.metasploit.com/users/hdm/tools/debian-openssl/ const size_t size = 3; vector<int> v = vector<int>(size); generate(v.begin(), v.end(), random); </code> ===== generate_n ===== ==== Deklaracja ==== <code cpp> #include <algorithm> // tu jest definicja szablonów generate i generate_n template <class OutputIterator, class Size, class Generator> void generate_n ( OutputIterator first, Size n, Generator gen ) </code> ==== Działanie ==== ''generate_n'' przypisuje wartość zwracaną przez kolejne wywołania ''gen'' począwszy od elementu ''first'' (włącznie z ''first'') dla ''n'' kolejnych elementów. ==== Parametry ==== * ''first'' - iterator pierwszego elementu kontenera * ''n'' - ilość kolejnych elementów do przypisania * ''gen'' - bezargumentowa funkcja lub funktor zwracająca obiekty typu przechowywanego przez kontener; wartość zwracana przez jej kolejne wywołania jest przypisywana kolejnym elementom. ==== Krótki przykład ==== <code cpp> /* Wypisuje "losowe" wartości na stdout */ int random() { return 9; } const size_t size = 3; generate_n(ostream_iterator<int>(cout, " "), size, random); </code> ===== Porównanie ===== Wydawać by się mogło, że szablony ''generate'' i ''generate_n'' w gruncie rzeczy robią to samo, więc są redundantne. Przecież wywołanie: <code cpp> generate_n (first, n, gen) </code> można zastąpić przez: <code cpp> generate (first, first+n, gen) </code> Jednak w funkcjach tych występują inne wymagania co do iteratora. Do wywołania ''generate'' potrzebny jest iterator wskazujący na koniec kontenera. A może się zdarzyć, że: * zwrócenie takiego iteratora jest kosztowne, szczególnie gdy potrzebujemy nie koniec, a na przykład połowę kolekcji; * otrzymanie takiego iteratora jest niemożliwe. Przykładowo takiej operacji (patrz {{:stl_algorytmy:generate_n.cpp}}): <code cpp> generate_n(ostream_iterator<GeneticAlgorithm::Individual>(os, " "), 10, ga.rig_) </code> za pomocą ''generate'' wykonać się nie da. ===== Podsumowanie ===== Szablony ''generate'' i ''generate_n'' umożliwiają łatwe wypełnianie kolekcji wartościami zwracanymi przez funkcje lub funktory. Są przydatne tam, gdzie wartości początkowe elementów kontenera zależą od stanu generatora.
generate_generate_n.1229109291.txt.gz
· ostatnio zmienione: 2008/12/12 20:14 przez
bfugas
Narzędzia strony
Pokaż stronę
Poprzednie wersje
Odnośniki
Do góry