本篇接着前篇stl变易算法(一)继续讲述变易算法。主要介绍transform、replace、replace_if、replace_copy以及replace_copy_if的用法及实现代码,并给出测试用例。
元素变换transform
transform算法用于实行容器元素的变换操作。如下两个使用原型,一个将迭代器区间[first,last)中元素,执行一元函数对象op操作,变换后的结果存放在[result,result+(last-first))区间中。另一个将迭代器区间[first1,last1)的元素*i,依次与[first2,first2+(last-first))的元素*j,执行二元函数操作binary_op(*i,*j),变换结果放在[result,result+(last1-first1))区间。
template <class InputIterator, class OutputIterator, class UnaryOperation>
OutputIterator transform (InputIterator first1, InputIterator last1,
OutputIterator result, UnaryOperation op);
template <class InputIterator1, class InputIterator2,
class OutputIterator, class BinaryOperation>
OutputIterator transform (InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, OutputIterator result,
BinaryOperation binary_op);
//transform算法函数的代码
template <class InputIterator, class OutputIterator, class UnaryOperator>
OutputIterator transform (InputIterator first1, InputIterator last1,
OutputIterator result, UnaryOperator op)
{
while (first1 != last1) {
*result = op(*first1); // or: *result=binary_op(*first1,*first2++);
++result; ++first1;
}
return result;
}
//测试用例
#include <algorithm>
#include <vector>
#include <list>
#include <iostream>
using namespace std;
int square(int x)
{
return x*x;
}
void print(int x)
{
cout << x << " ";
}
int main(void)
{
//vector初始化
vector<int> v;
v.push_back(5);
v.push_back(15);
v.push_back(25);
//list初始化
list<int> l(3);
//对vector容器元素执行平方运算,放入list容器
transform(v.begin(), v.end(), l.begin(), square);
//打印链表元素
for_each(l.begin(), l.end(), print);
cout << endl;
return 0;
}
替换replace
replace算法将指定元素值替换为新值,使用原型如下,将迭代器区间[first,last)中值为old_value的元素全部替换为new_value值。
template <class ForwardIterator, class T>
void replace (ForwardIterator first, ForwardIterator last,
const T& old_value, const T& new_value)
{
while (first!=last) {
if (*first == old_value) *first=new_value;
++first;
}
}
#include <algorithm>
#include <vector>
#include <iostream>
using namespace std;
void print(int x)
{
cout << x << " ";
}
int main(void)
{
vector<int> v;
v.push_back(13);
v.push_back(25);
v.push_back(27);
v.push_back(25);
v.push_back(29);
//将v的25全部替换为100
replace(v.begin(), v.end(), 25, 100);
cout << "v向量元素: ";
for_each(v.begin(), v.end(), print);
cout << endl;
//将iArray的5全部替换为200
int iArray[7]={3,6,5,9,5,5,10};
replace(iArray, iArray+7, 5, 200);
cout << "数组iArray元素: ";
for_each(iArray, iArray+7, print);
cout << endl;
return 0;
}
条件替换replace_if
replace_if算法是replace算法的一个带谓词判断的版本,使用原型如下,将迭代器区间[first,last)中满足一元谓词判断条件的元素全部替换为new_value。
//replace_if算法函数的代码
template < class ForwardIterator, class UnaryPredicate, class T >
void replace_if (ForwardIterator first, ForwardIterator last,
UnaryPredicate pred, const T& new_value)
{
while (first!=last) {
if (pred(*first)) *first=new_value;
++first;
}
}
//测试用例
#include <algorithm>
#include <vector>
#include <iostream>
bool odd(int x){
return x % 2;
}
int main(void){
using namespace std;
vector <int> v(10);
unsigned int i;
for(i = 0; i < v.size(); i++) {
v[i] = i % 7;
cout << v[i] << ' ';
}
cout << endl;
//将奇数元素替换为38
replace_if(v.begin(), v.end(), odd, 38);
for(i = 0; i < v.size(); i++)
cout << v[i] << ' ';
cout << endl;
return 0;
}
替换和复制replace_copy
replace_copy算法先进行元素替换,再将元素复制到新容器。它的使用原型如下,将迭代器区间[first,last)中元素值为old_value的元素替换为new_value,并全部拷贝到[result,result+(last-first))中(包括不替换的元素),迭代器[first,last)区间上的元素仍保持不变。
//replace_copy算法函数代码
template <class InputIterator, class OutputIterator, class T>
OutputIterator replace_copy (InputIterator first, InputIterator last,
OutputIterator result, const T& old_value, const T& new_value)
{
while (first!=last) {
*result = (*first==old_value)? new_value: *first;
++first; ++result;
}
return result;
}
//实例
#include <algorithm>
#include <list>
#include <iostream>
using namespace std;
void print(int x){
cout << x << ' ';
}
int main(void){
list<int> l1;
l1.push_back(1);
l1.push_back(3);
l1.push_back(1);
l1.push_back(6);
l1.push_back(8);
//将l1链表元素1替换为100,然后拷贝到l2链表
list<int> l2(5);
replace_copy(l1.begin(), l1.end(), l2.begin(), 1, 100);
cout << "l1保持不变: ";
for_each(l1.begin(), l1.end(), print);
cout << "\nl2元素为: ";
for_each(l2.begin(), l2.end(), print);
cout << endl;
return 0;
}
条件替换和复制replace_copy_if
replace_copy_if算法是replace_copy算法的一个带谓词判断的版本,使用原型如下,将迭代器区间[first,last)中满足一元谓词判断pred的元素替换为new_value,然后全部拷贝到[result,result+(last-first))中(包括不替换的元素),迭代器[first,last)区间的元素仍保持不变。
//replace_copy_if算法函数的代码
template<class InputIter, class OutputIter, class Predicate, class T>
OutputIter replace_copy_if(InputIter first, InputIter last,
OutputIter result,
Predicate pred, const T& new_value)
{
for( ; first!=last; ++first, ++result)
*result=pred(*first)? new_value : *first;
return result;
}
//测试用例
#include <algorithm>
#include <vector>
#include <list>
#include <iostream>
using namespace std;
bool odd(int x){
return x % 2;
}
int main(void){
using namespace std;
vector <int> v(10);
unsigned int i;
for(i = 0; i < v.size(); i++) {
v[i] = i % 7;
cout << v[i] << ' ';
}
cout << endl;
//将向量v中奇数元素替换为38后,拷贝到链表l
list<int> l(10);
replace_copy_if(v.begin(), v.end(), l.begin(), odd, 38);
list<int>::iterator list_iter;
for(list_iter=l.begin(); list_iter!=l.end(); list_iter++)
cout << *list_iter << ' ';
cout << endl;
return 0;
}
未完待续……
转载请注明出处:http://blog.csdn.net/lsh_2013/article/details/46885387