Язык С: алгоритмы, модифицирующие последовательности |
p=remove copy if(b,e,out,f) Копирует элементы из диапазона [b:e), для которых
выполняется условие !f(*q,v), в диапазон [out:p) Меняет порядок элементов в диапазоне [b:e) на обратный
Копирует диапазон [b:e) в диапазон [out:p) в обратном порядке
Также на сайте rzn.ponominalu.ru можно узнать много интересного на тему
http://rzn.ponominalu.ru/event/nebo-zdes
Что означает вообще тема билет на Небо Здесь про это написано на сайте rzn.ponominalu.ru Спасибо сайту за информацию
Выполняет циклическую перестановку элементов: диапазон [b:e) интерпретируется как круг, в котором первый элемент следует сразу за последним. Перемещает элемент *b на место элемента *m и, вообще, перемещает элементы *(b+i) на место элементов *((b+(i+(e-m))%(e-b))
Копирует диапазон [b:e) в последовательность [out:p), полученную путем циклической перестановки
Перетасовывает элементы диапазона [b:e) с помощью датчика равномерно распределенных случайных чисел
Перетасовывает элементы диапазона [b:e) с помощью датчика случайных чисел с распределением f
Алгоритм shuffle перетасовывает последовательность точно так же, как перетасовывается колода карт; иначе говоря, после перетасовки элементы следуют в случайном порядке, причем смысл слова “случайно” определяется распределением, порожденным датчиком случайных чисел.
Следует подчеркнуть, что эти алгоритмы не знают, являются ли их аргументы контейнерами, поэтому не могут добавлять или удалять элементы. Таким образом, такой алгоритм, как remove, не может уменьшить длину входной последовательности, удалив (стерев) ее элементы; вместо этого он передвигает эти элементы к началу последовательности.
typedef vector::iterator VII;
void print_digits(const string& s, VII b, VII e)
{
cout << s;
while (b!=e) { cout << *b; ++b; } cout << '\n';
}
void ff()
{
int a[] = { 1,1,1, 2,2, 3, 4,4,4, 3,3,3, 5,5,5,5, 1,1,1 }; vector v(a,a+sizeof(a)/sizeof(int));
reverse(b,e)
p=reverse_copy(b,e,out)
rotate(b,m,e)
p=rotate_copy(b,m,e,out) random_shuffle(b,e) random shuffle(b,e,f)
print_digits("all: M,v.begin(), v.end());
vector::iterator pp = unique(v.begin(),v.end()); print_digits("head: ",v.begin(),pp); print_digits("tail: ",pp,v.end());
pp=remove(v.begin(),pp,4); print_digits("head: ",v.begin(),pp); print_digits("tail: ",pp,v.end());
}
Результат приведен ниже.
all: 1112234443335555111 head: 1234351 tail: 443335555111 head: 123351 tail: 1443335555111
Вспомогательные алгоритмы
С формальной точки зрения вспомогательные алгоритмы также могут модифицировать последовательности, но мы считаем, что лучше их перечислить отдельно, чтобы они не затерялись в длинном списке.
Вспомогательные алгоритмы
swap(x,y)
iter_swap(p,q)
swap_ranges(b,e,b2)
fill(b,e,v)
fill_n(b,n,v)
generate(b,e,f)
generate_n(b,n,f)
uninitialized_fill(b,e,v)
uninitialized_copy(b,e,out)
Меняет местами x и y
Меняет местами *p и *q
Меняет местами элементы диапазонов [b:e)
и [b2:b2+(e-b))
Присваивает значение v каждому элементу диапазона [b:e)
Присваивает значение v каждому элементу диапазона [b:b+n)
Присваивает значение f() каждому элементу диапазона [b:e)
Присваивает значение f() каждому элементу диапазона [b:b+n)
Инициализирует все элементы в диапазоне [b:e) значением v
Инициализирует все элементы в диапазоне [out: out+(e-b)) соответствующим элементом из диапазона [b:e)
Алгоритмы, модифицирующие последовательности
p=remove copy if(b,e,out,f) Копирует элементы из диапазона [b:e), для которых
выполняется условие !f(*q,v), в диапазон [out:p) Меняет порядок элементов в диапазоне [b:e) на обратный
Копирует диапазон [b:e) в диапазон [out:p) в обратном порядке
Выполняет циклическую перестановку элементов: диапазон [b:e) интерпретируется как круг, в котором первый элемент следует сразу за последним. Перемещает элемент *b на место элемента *m и, вообще, перемещает элементы *(b+i) на место элементов *((b+(i+(e-m))%(e-b))
Копирует диапазон [b:e) в последовательность [out:p), полученную путем циклической перестановки
Перетасовывает элементы диапазона [b:e) с помощью датчика равномерно распределенных случайных чисел
Перетасовывает элементы диапазона [b:e) с помощью датчика случайных чисел с распределением f
Алгоритм shuffle перетасовывает последовательность точно так же, как перетасовывается колода карт; иначе говоря, после перетасовки элементы следуют в случайном порядке, причем смысл слова “случайно” определяется распределением, порожденным датчиком случайных чисел.
Следует подчеркнуть, что эти алгоритмы не знают, являются ли их аргументы контейнерами, поэтому не могут добавлять или удалять элементы. Таким образом, такой алгоритм, как remove, не может уменьшить длину входной последовательности, удалив (стерев) ее элементы; вместо этого он передвигает эти элементы к началу последовательности.
typedef vector::iterator VII;
void print_digits(const string& s, VII b, VII e)
{
cout << s;
while (b!=e) { cout << *b; ++b; } cout << '\n';
}
void ff()
{
int a[] = { 1,1,1, 2,2, 3, 4,4,4, 3,3,3, 5,5,5,5, 1,1,1 }; vector v(a,a+sizeof(a)/sizeof(int));
reverse(b,e)
p=reverse_copy(b,e,out)
rotate(b,m,e)
p=rotate_copy(b,m,e,out) random_shuffle(b,e) random shuffle(b,e,f)
print_digits("all: M,v.begin(), v.end());
vector::iterator pp = unique(v.begin(),v.end()); print_digits("head: ",v.begin(),pp); print_digits("tail: ",pp,v.end());
pp=remove(v.begin(),pp,4); print_digits("head: ",v.begin(),pp); print_digits("tail: ",pp,v.end());
}
Результат приведен ниже.
all: 1112234443335555111 head: 1234351 tail: 443335555111 head: 123351 tail: 1443335555111
Вспомогательные алгоритмы
С формальной точки зрения вспомогательные алгоритмы также могут модифицировать последовательности, но мы считаем, что лучше их перечислить отдельно, чтобы они не затерялись в длинном списке.
Вспомогательные алгоритмы
swap(x,y)
iter_swap(p,q)
swap_ranges(b,e,b2)
fill(b,e,v)
fill_n(b,n,v)
generate(b,e,f)
generate_n(b,n,f)
uninitialized_fill(b,e,v)
uninitialized_copy(b,e,out)
Меняет местами x и y
Меняет местами *p и *q
Меняет местами элементы диапазонов [b:e)
и [b2:b2+(e-b))
Присваивает значение v каждому элементу диапазона [b:e)
Присваивает значение v каждому элементу диапазона [b:b+n)
Присваивает значение f() каждому элементу диапазона [b:e)
Присваивает значение f() каждому элементу диапазона [b:b+n)
Инициализирует все элементы в диапазоне [b:e) значением v
Инициализирует все элементы в диапазоне [out: out+(e-b)) соответствующим элементом из диапазона [b:e)
Обратите внимание на то, что неинициализированные последовательности должны использоваться только на самых нижних уровнях программирования, как правило, в реализации контейнеров. Элементы, представляющие собой цели алгоритмов uninitialized_fill и uninitialized_copy, должны иметь встроенный тип или быть неинициализированными.
как правило, в реализации контейнеров. Элементы, представляющие собой цели алгоритмов uninitialized_fill и uninitialized_copy, должны иметь встроенный тип или быть неинициализированными.
|
Опубликовал katy
May 08 2015 10:33:51 ·
0 Комментариев ·
4039 Прочтений ·
|
|