C++算法与泛型算法(algorithm、numeric)

2020-02-20 12:00:58王冬梅
int arr1[] = { 1,2,3 };
int arr2[sizeof(arr1)/sizeof(*arr1)];
 
auto ret = copy(begin(arr1), end(arr1), arr2); //将数组1拷贝给数组2。ret为arr2数组最后元素的下一个位置
 
for (auto i = 0; i < sizeof(arr2) / sizeof(*arr2); i++) {
 cout << arr2[i]<< endl;
}

copy_backward

该函数与copy的不同之处在于: copy是从第一个元素开始拷贝,而copy_backward是从最后一个元素开始拷贝 copy的第3个参数是接受拷贝的容器起始位置,而copy_backward是目的序列的结束迭代器 会复制前两个迭代器参数指定的序列。第三个参数是目的序列的结束迭代器

replace()

将指定范围内指定的元素替换为另一个值 参数:1、2指定替换的范围。3:目标值,4:替换后的值
vector<int> vec{ 1,0,0,0,5 };
replace(vec.begin(), vec.end(), 0,66); //将vec中为0的全部替换为66
 
for (auto v = vec.cbegin(); v != vec.cend(); v++) {
	cout << *v << endl;
}

replace_copy()

此函数会保留原容器不变,然后将替换后的结果保存在另一个容器中 参数:参数12位要替换的范围。参数3位另一个容器的起始位置。参数4目标值。参数5替换后的值
vector<int> vec{ 1,0,0,0,5 };
vector<int> vec2;
 
replace_copy(vec.begin(), vec.end(),back_inserter(vec2), 0,66); //vec的元素保持不变,vec2为替换后的值
	
for (auto v = vec2.cbegin(); v != vec2.cend(); v++) {
 cout << *v << endl;
}

next_permutation()

功能:对一个迭代区间的数值进行全排列 返回值:会根据前面next_permutation函数的调用,当操作的区间不存在下一个排列时,函数返回false;否则如果可以继续进行全排列,那么就返回true
//函数原型
#include <algorithm>
bool next_permutation(iterator start,iterator end)

演示案例:下面的程序每调用一次next_permutation就会对我们制定的迭代区间进行一次排列,直到得出全部排列之后,返回false

int *p = new int[3] {1, 2, 3};
do {
 for (int i = 0; i < 3; ++i){
  cout << p[i];
 }
 cout << endl;
} while (next_permutation(p, p + 3));

prev_permutation()

与next_permutation的功能显示,区别就是prev_permutation是求当前排列的前一个排列,而next_permutation是求当前排列的下一个排列

五、重排元素算法

sort()、unqie()、stable_sort()

因为会改变值,所以不能使用只读迭代器(cbegin()、cend())

sort()

将容器内的元素按照运算符“<”的规则排序,从小到大 参数:一个容器的迭代器范围