#include <algorithm> #include <vector> #include <string> #include <iostream> using namespace std; /************************************************************************/ /* */ template<class _OutIt, class _Diff, class _Ty> inline void __CLRCALL_OR_CDECL my_Fill_n(_OutIt _First, _Diff _Count, const _Ty& _Val, _Range_checked_iterator_tag) { // copy _Val _Count times through [_First, ...) for (; 0 < _Count; --_Count, ++_First) *_First = _Val; } inline void __CLRCALL_OR_CDECL my_Fill_n(_Out_opt_capcount_(_Count) char *_First, size_t _Count, int _Val, _Range_checked_iterator_tag) { // copy char _Val _Count times through [_First, ...) #if _HAS_ITERATOR_DEBUGGING if (0 < _Count) _DEBUG_POINTER(_First); #endif /* _HAS_ITERATOR_DEBUGGING */ ::memset(_First, _Val, _Count); } template<class _OutIt, class _Diff, class _Ty> inline _SCL_INSECURE_DEPRECATE _IF_NOT_CHK_(_OutIt, void) __CLRCALL_OR_CDECL my_fill_n(_OutIt _First, _Diff _Count, const _Ty& _Val) { // copy _Val _Count times through [_First, ...) my_Fill_n(_First, _Count, _Val, _Iter_cat(_First), _STD _Range_checked_iterator_tag()); } /************************************************************************/ class print_elements { public: void operator()( string elem ) { cout << elem << ( _line_cnt++%8 ? " " : "/n/t" ); } static void reset_line_cnt() { _line_cnt = 1; } private: static int _line_cnt; }; int print_elements::_line_cnt = 1; int main() { int value = 9; int count = 3; int ia[] = { 0, 1, 1, 2, 3, 5, 8 }; ostream_iterator< int > iofile( cout, " " ); cout << "original element sequence of array container:/n"; copy( ia, ia + 7, iofile ); cout << "/n/n"; fill_n( ia + 2, count, value ); cout << "array after fill_n( ia+2, 3, 9 ):/n"; copy( ia, ia+7, iofile ); cout << "/n/n"; string replacement( "xxxxx" ); string sa[] = { "Stephen", "closed", "his", "eyes", "to", "hear", "his", "boots", "crush", "crackling", "wrack", "and", "shells" }; vector< string > svec( sa, sa + 13 ); cout << "original sequence of strings:/n/t"; for_each( svec.begin(), svec.end(), print_elements() ); cout << "/n/n"; fill_n( svec.begin() + 3, count * 2, replacement ); print_elements::reset_line_cnt(); cout << "sequence after fill_n() applied:/n/t"; for_each( svec.begin(), svec.end(), print_elements() ); cout << "/n"; return 0; } #include <algorithm> #include <list> #include <string> #include <iostream> using namespace std; /* generates: original array element sequence: 0 1 1 2 3 5 8 array after fill(ia+1,ia+6): 0 9 9 9 9 9 8 original list element sequence: c eiffel java ada perl list after fill(++ibegin,--iend): c c++ c++ c++ perl */ /************************************************************************/ /* */ // TEMPLATE FUNCTION fill template<class _FwdIt, class _Ty> inline void __CLRCALL_OR_CDECL my_Fill(_FwdIt _First, _FwdIt _Last, const _Ty& _Val) { // copy _Val through [_First, _Last) _DEBUG_RANGE(_First, _Last); for (; _First != _Last; ++_First) *_First = _Val; } inline void __CLRCALL_OR_CDECL my_Fill(_Out_capcount_x_(_Last-_First) char *_First, _In_opt_ char *_Last, int _Val) { // copy char _Val through [_First, _Last) _DEBUG_RANGE(_First, _Last); ::memset(_First, _Val, _Last - _First); } template<class _FwdIt, class _Ty> inline void __CLRCALL_OR_CDECL my_fill(_FwdIt _First, _FwdIt _Last, const _Ty& _Val) { // copy _Val through [_First, _Last) my_Fill(_CHECKED_BASE(_First), _CHECKED_BASE(_Last), _Val); } /************************************************************************/ int main() { const int value = 9; int ia[] = { 0, 1, 1, 2, 3, 5, 8 }; ostream_iterator< int > ofile( cout, " " ); cout << "original array element sequence:/n"; copy( ia, ia+7, ofile ); cout << "/n/n"; fill( ia+1, ia+6, value ); cout << "array after fill(ia+1,ia+6):/n"; copy( ia, ia+7, ofile ); cout << "/n/n"; string the_lang( "c++" ); string langs[5] = { "c", "eiffel", "java", "ada", "perl" }; list< string> il( langs, langs+5 ); ostream_iterator< string > sofile( cout, " " ); cout << "original list element sequence:/n"; copy( il.begin(), il.end(), sofile ); cout << "/n/n"; typedef list<string>::iterator list_iterator; list_iterator ibegin = il.begin(), iend = il.end(); my_fill( ++ibegin, --iend, the_lang ); cout << "list after fill(++ibegin,--iend):/n"; copy( il.begin(), il.end(), sofile ); cout << "/n/n"; return 0; }