C++_算法_变动性算法

STL中,提高诸多功能完善的算法,能够对所作用的容器进行修改的算法称为变动性算法。改变容器中的值一般包括两种方法。
方法一:使用迭代器遍历元素的过程中,直接改变元素的值。
方法二:在元素复制过程中,改变元素的值。

变动性算法分为以下八类:
复制

OutputIterator copy(InputIterator_First, InputIterator_Last, OutputIterator_DestBeg);
BidirectionalIterator2 copy_backward(BidirectionalIterator1_First, BidirectionalIterator1_Last, BidirectionalIterator2_DestEnd);

说明:函数copy()实现将(_First, _Last)指定范围的所有元素复制到另一个容器中由_DestBeg指定的起始位置。函数copy_backward()的输入参数均是双向迭代器,返回值也是双向迭代器,唯一不同的是:函数从指定范围的最后一个元素开始复制,之后向前直到第一个元素。总而言之,copy()函数是正向遍历,copy_backward()是逆向遍历。当源区间和目标区间存在重复区域时,要特别注意。

转换

template<class InIt, class OutIt, class Unop> OutIt transform(InIt first, InIt last, OutIt x, Unop nop);
template<class InIt1, class InIt2, class OutIt, class Binop> OutIt transform(InIt1 first1, InIt1 last1, InIt2 first2, OutIt x, Binop bop);

说明:第一种形式,针对源区间[first, last]中每个元素均调用函数uop(ele),并将结果写入以x为起始的目标空间。函数返回值是“最后一个被转换元素”的下一个位置。第二种形式,针对源区间[first, end]中的每个元素,和从first2开始的第二个区间的对应元素,调用函数或规则bop(ele1, ele2),并将结果写入以x为起始的目标区间。函数返回值同第一种形式。

互换

template<class T> void swap(T& a, T& b);
template<class FwdIt1, class FwdIt2> FwdIt2 swap_ranges(FwdIt1 first, FwdIt1 last, FwdIt2 x);

说明:第一种形式交换两个类型相同的容器对象。第二种形式,[first, last]区间内的元素和另一容器以迭代器x起始的元素进行交换。

赋值

template<class FwdIt, class T> void fill(FwdIt first, FwdIt last, const T& x);
template<class OutIt, class Size, class T> void fill_n(OutIt first, Size n, const T& x);
template<class FwdIt, class Gen> void generate(FwdIt first, FwdIt last, Gen g);
template<class OutIt, class Pred, class Gen> void generate_n(OutIt first, Dist n, Gen g);

说明:算法函数fill()和fill_n()用于给每个元素赋予相同的值;算法函数generate()和generate_n()执行时会调用函数的子进程、仿函数(g)或自定义的函数,甚至使用特定的算法。产生新值,并赋予容器中的元素。fill_n()和generate_n()均指定了赋值区间的起始位置和赋值元素的个数。

替换

template<class FwdIt, class T> void replace(FwdIt first, FwdIt last, const T& vold, const T& vnew);
template<class FwdIt, class Pred, class T> void replace_if(FwdIt first, FwdIt last, Pred pr, const T& val);

说明:第一种形式的replace()是替换容器(序列)的[first, last]范围中和vold值相等的元素,将这些元素的值替换为vnew。第二种形式的replace_if()是替换容器的[first, end]范围中能够使规则pr为“真”的元素,并将这些元素修正为val。

逆转

template<class Bidirectional Iterator> void reverse(BidirectionalIterator first, BidirectionalIterator last);
template<class Bidirectional Iterator, class OutputIterator> OutputIterator reverse_copy(BidirectionalIterator first, BidirectionalIterator last, OutputIterator result);

说明:算法reverse()会将区间[first, last]中的元素全部逆序;reverse_copy()会将源区间[first, last]内的元素复制到“以destBeg起始的目标区间”,返回值为第一个未被覆盖的值。

旋转

template<class ForwardIterator> void rotate(ForwardIterator first, ForwardIterator middle, ForwardIterator last);
template<class ForwardIterator, class OutputIterator> OutputIterator rotate_copy(ForwardIterator first, ForwardIterator middle, ForwardIterator last, OutputIterator result);

说明:函数rotate()将容器中的元素或序列看作一个环,旋转这些元素直到原来middle处的元素到达first位置。旋转运算是使序列中的元素按照一个环的方式旋转,而不是简单的左移。函数rotate_copy()产生一个旋转后的副本,即在旋转之后会复制参加旋转的元素,该函数的源区间和目标区间不允许重复。

排列
a.元素排列

template<class BidirectionalIterator>
bool next_permutation(BidirectionalIterator first, BidirectionalIterator last);
template<class BidirectionalIterator, class Compare>
bool next_permutation(BidirectionalIterator first, BidirectionalIterator last, Compare comp);

说明:此种算法会改变容器中的元素次序,排序方式为字典式“正规”排序。第一种为升序,第二种为降序。

b.元素重排

template<class RandomAccessIterator> void random_shuffle( RandomAccessIterator first,  RandomAccessIterator last);
template<class RandomAccessIterator, class RandomNumberGenerator> void random_shuffle( RandomAccessIterator first,  RandomAccessIterator last, RandomNumberGenerator& rand);

说明:此种算法会对容器中的元素进行随机排序,一般有两种形式:第一种为均匀分布随机的排序,第二种按指定规则打乱容器中的元素次序。

c.将元素向前搬移

template<class BidirectionalIterator, class Predicate>
BidirectionalIterator partition(BidirectionalIterator first, BidirectionalIterator last, Predicate pred);
template<class BidirectionalIterator, class Predicate>
BidirectionalIterator stable_partition(BidirectionalIterator first, BidirectionalIterator last, Predicate pred);

说明:此种算法按指定的一元判断式向前搬移元素,当一元判断式为“真”时,算法会向前移动符合条件的元素,函数返回值是使一元判断式为“假”的第一个元素位置。第一种不排序,第二种会保留一个相对的次序。

注意:实现上述算法时,目标容器或目标区间不能是关联式容器,因为关联性容器是内部自动排序的,关联式容器的元素均被视为常数,也是不允许作为变量使用的,否则无法保证其内部自动排序。

猜你喜欢

转载自blog.csdn.net/sss_0916/article/details/83779720