stl变易算法(二)

本篇接着前篇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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值