stl变易算法(一)

C++ STL的变易算法是一组能够修改容器元素数据的模板函数,可进行序列容器的复制、交换、替换、填充、移除、旋转等。这些算法对迭代器有较高的要求,具体的迭代器类型随各个算法而定,或向前迭代器、或双向迭代器、又或者是随机迭代器,以提供算法所需要的迭代器操作。应用变易算法时,先要检查容器的迭代器是否符合要求,防止产生编译错误。


元素复制copy

C++STL提供一个用于容器间元素拷贝的copy算法,将迭代区间[first,last)的元素复制到由复制目标迭代器result给定的区间[result,result+(last-first))中,原型如下:

template <class InputIterator, class OutputIterator>
  OutputIterator copy (InputIterator first, InputIterator last, OutputIterator result);

具体代码如下:

template<class InputIterator, class OutputIterator>
  OutputIterator copy (InputIterator first, InputIterator last, OutputIterator result)
{
  while (first!=last) {
    *result = *first;
    ++result;
    ++first;
  }
  return result;
}  
//实例
#include <algorithm>
#include <vector>
#include <list>
#include <iostream>
using namespace std;

void print(int x){
    cout << x << "  ";
}

int main(void){
    //初始化向量v
    vector<int> v;
    v.push_back(1);
    v.push_back(3);
    v.push_back(5);
    //初始化双向链表l
    list<int> l;
    l.push_back(2);
    l.push_back(4);
    l.push_back(6);
    l.push_back(8);
    l.push_back(10);
    //复制v到l
    copy(v.begin(), v.end(), l.begin());
    //链表l打印l 3 5 8 10
    for_each(l.begin(), l.end(), print);
    cout <<endl;
    return 0;
}


反向复制copy_backward

与copy算法相似,copy_backward算法也是将一个迭代器区间元素复制到另一迭代器区间上,只是复制的过程是从最后的元素开始复制,直到首元素复制出来。

它使用的原型如下,将迭代器区间[first,last)的元素,复制到以result为结束位置的区间[result-(last-first))中,顺序为*(last-1)复制到*(result-1)、*(last-2)复制到*(result-2)、*(last-3)复制到*(result-3)、……

//copy_backward算法函数的代码
template<class BidirectionalIterator1, class BidirectionalIterator2>
  BidirectionalIterator2 copy_backward ( BidirectionalIterator1 first,
                                         BidirectionalIterator1 last,
                                         BidirectionalIterator2 result )
{
  while (last!=first) *(--result) = *(--last);
  return result;
}
//测试用例
#include <algorithm>
#include <vector>
#include <iostream>
using namespace std;

void print(int x){
    cout << x << ‘ ‘;
}

int main(void){
    vector<int> v(10);
    for(unsigned int i=0; i<v.size(); i++)
        v[i]=i+1;
    copy_backward(v.begin(), v.begin() + 3, v.end());
    for_each(v.begin(), v.end(), print);
    cout << endl;
    system("pause");
    return 0;
}


元素交换swap

虽然大多数容器的内部提供了swap函数,但c++STL还是以更一般的迭代器形式,提供更一般的swap算法来实现两个元素的交换。

//swap算法函数的代码
template <class T> void swap ( T& a, T& b )
{
  T c(a); a=b; b=c;
}
//实例
#include <algorithm>
#include <iostream>
using namespace std;
int main(void)
{
    int a = 5;
    int b = 26;
    cout << "交换前 " << "a = " << a << " b = " << b << endl;
    swap(a, b);
    cout << "交换后 " << "a = " << a << " b = " << b << endl;
    return 0;
}


迭代器交换iter_swap

iter_swap算法是swap算法的迭代器形式,使交换算法更易用于一般的容器。

template <class ForwardIterator1, class ForwardIterator2>
  void iter_swap (ForwardIterator1 a, ForwardIterator2 b)
{
  swap (*a, *b);
}
//例子
#include <algorithm>
#include <iostream>
using namespace std;
int main(void)
{
    int a = 5;
    int b = 26;
    cout << "交换前 " << "a = " << a << " b = " << b << endl;
    iter_swap(&a, &b);
    cout << "交换后 " << "a = " << a << " b = " << b << endl;
    system("pause");
    return 0;
}


区间元素交换swap_ranges

直观来说,swap_ranges算法用于进行两个迭代器区间元素的交换。它的使用原型如下,将[first1,last1)迭代器区间的元素,与[first2,first2+(last1-first1))迭代器区间元素交换,其中*first1和*first2交换,*(first1+1)和*(first2+1)交换、……、*(last1-1)和*(first2+(last1-first1)-1)交换。

template<class ForwardIterator1, class ForwardIterator2>
  ForwardIterator2 swap_ranges (ForwardIterator1 first1, ForwardIterator1 last1,
                                ForwardIterator2 first2)
{
  while (first1!=last1) {
    swap (*first1, *first2);
    ++first1; ++first2;
  }
  return first2;
}
//实例
#include <algorithm>
#include <vector>
#include <iostream>
using namespace std;

void print(int x)
{
    cout << x << " ";
}

int main(void)
{
    vector<int> v1, v2;
    v1.push_back(1);
    v1.push_back(3);
    v1.push_back(5);
    v2.push_back(2);
    v2.push_back(4);
    v2.push_back(6);
    //打印v1、v2
    cout << "交换前, v1=";
    for_each(v1.begin(), v1.end(), print);
    cout << "v2=";
    for_each(v2.begin(), v2.end(), print);
    cout << endl;
    //交换v1、v2
    swap_ranges(v1.begin(), v1.end(), v2.begin());
    //打印v1、v2
    cout << "交换后, v1=";
    for_each(v1.begin(), v1.end(), print);
    cout << "v2=";
    for_each(v2.begin(), v2.end(), print);
    cout << endl;
    return 0;
}



未完待续……

转载请注明出处:http://blog.csdn.net/lsh_2013/article/details/46854397

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-16 07:05:29

stl变易算法(一)的相关文章

stl变易算法(二)

本篇接着前篇stl变易算法(一)继续讲述变易算法.主要介绍transform.replace.replace_if.replace_copy以及replace_copy_if的用法及实现代码,并给出测试用例. 元素变换transform transform算法用于实行容器元素的变换操作.如下两个使用原型,一个将迭代器区间[first,last)中元素,执行一元函数对象op操作,变换后的结果存放在[result,result+(last-first))区间中.另一个将迭代器区间[first1,la

stl变易算法(三)

本篇接着前面stl变易算法(一)和stl变易算法(二)继续讲述变易算法. 这里将介绍完余下的变易算法,主要有:填充fill.n次填充fill_n.随机生成元素generate.随机生成n个元素generate_n.移除复制remove_copy.条件移除复制remove_copy_if.移除remove.条件移除remove_if.不连续反复元素复制unique_copy.剔除连续反复元素unique.元素反向reverse.反向复制reverse_copy及旋转rotate .给出算法实现及实

stl非变易算法(一)

C++ STL的非变易算法是一组不破坏操作数据的模板函数,用来对序列数据进行逐个处理.元素查找.子序列搜索.统计和匹配.非变易算法具有极为广泛的适用性,基本上可应用于各种容器. 逐个容器元素for_each C++ STL提供了一个for_each函数,用于对容器的元素进行循环操作.它对迭代区间[first, last)所指的每一个元素,执行由单参函数对象fn所定义的操作.原型如下: template<class InputIterator, class Function> Function

stl非变易算法(二)

这里接着上篇stl非变易算法(一)进行总结.主要解析算法函数count.count_if.mismatch.equal.search.search_n以及find_end,给出算法函数的实现及测试用例.下面直接进入正题. 统计等于某值的容器元素个数count count函数用于计算容器中某个给定值的出现次数.计算迭代区间[first,last)上等于val值的元素个数ret,返回计数. //count算法函数的实现代码 template <class InputIterator, class T

STL非变易算法

非变易算法:原则上不会变更操作数据的算法. [1]    for_each:逐个容器元素,原型for_each(InputIter first, InputIter last, Function f). [2]    find:顺序查找容器元素,原型InputIter find(InputIter first, InputIter last, constT &val, input_iterator_tag). [3]    find_if:条件查找容器,原型InputIter find_if(I

【STL】帮你复习STL泛型算法 一

STL泛型算法 #include <iostream> #include <vector> #include <algorithm> #include <iterator> #include <numeric> #include <list> using std::cout; using std::endl; using std::vector; using std::list; bool IsOushu(const int&

第22章 变易算法

  第22章 变易算法  Modifying  sequence operations    22.1 元素复制copycopy  Copy range of elements (function template)      22.2 反向复制copy_backwardcopy_backward  Copy range of elements backwards (function template)      22.3 元素交换swapswap  Exchange values of two

初探STL之算法

算法 STL算法部分主要由头文件<algorithm>,<numeric>,<functional>组成.要使用 STL中的算法函数必须包含头文件<algorithm>,对于数值算法须包含<numeric>,<functional>中则定义了一些模板类,用来声明函数对象. 分类 STL中算法大致分为四类: 1.非可变序列算法:指不直接修改其所操作的容器内容的算法. 2.可变序列算法:指可以修改它们所操作的容器内容的算法. 3.排序算法

STL之算法总结

STL之算法总结 STL算法部分主要由头文件<algorithm>,<numeric>,<functional>组成. 要使用 STL中的算法函数必须包含头文件<algorithm>, 对于数值算法须包含<numeric>,<functional>中则定义了一些模板类,用来声明函数对象. STL中算法大致分为四类: 1.非可变序列算法:指不直接修改其所操作的容器内容的算法. 2.可变序列算法:指可以修改它们所操作的容器内容的算法. 3