在学习C语言时,当我们需要互换两个数的时候,我们会这么写,或者通过指针去写.
int temp = a;
a = b;
b = temp;
所以在STL中针对互换容器内的元素时,就有了iter_swap基础算法,就是用来互换两个指针所指向内容的方法.
#include <iostream>
#include <algorithm>
#include <vector>
#include <functional>
using namespace std;
int main()
{
vector<int> s = {1,2,3,4,5};
vector<int> temp = {10,9,8,7,6};
iter_swap(s.begin(),--temp.end());//s: 6 2 3 4 5
//temp: 10 9 8 7 1
system("pause");
return 0;
}
下面是iter_swap的实现:
template <typename T>
void myIter_swap(T left, T right)
{
auto temp = *left;
*left = *right;
*right = temp;
}
当我们学会了iter_swap的用法之后,就可以用iter_swap来实现reverse倒序算法了.
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main()
{
vector<int> s = {1,2,3,4,5};
//用来把容器内指定范围内的元素倒过来排,也相当于翻转.也可以用到rotate算法,这里不提.
reverse(s.begin(), s.end());
for (auto temp: s)
{
cout << temp<< " ";//输出 5 4 3 2 1.
}
cout << endl;
system("pause");
return 0;
}
实现reverse倒序算法.
template <typename T>
void myReverse(T first, T last)
{
while (first < last)
{
iter_swap(first++, --last);
}
}
reverse_copy同理:
template <typename T>
void my_Reserve_copy(T first, T last, T new_first)
{
while (first != last)
{
//注意尾迭代器是取不到的,遵循了左闭右开原则!!
*new_first++ = *--last;
}
}
我们知道在string,vector这些一大块连续内存的数据容器用起来都是十分方便的,比如string重载了’+’运算符,可以更直观的对字符串进行操作,vector的迭代器也可以直接和数字相加减,获取想要的迭代器的位置,但对于list来说,就有些麻烦了,比如:
list<int> s = {1,3,5,7,9,11,13,15};
auto temp = s.begin();
//我们想要获取一个指向9的迭代器.
//有朋友说,那这样不就好了嘛,但这样其实是错误的,因为list没有重载'+'号运算符.
auto c = s.begin()+4;
//甚至有些朋友是这样做的:虽然结果是正确的,但有两个问题,第一个问题是比较麻烦,别人看起来也不方便,第二个问题是:不同的编译器给出的结果都是不同的,因为明确规定了:在一个表达式中,变量的值只能被改变一次,如果多次改变,那么其结果是未定义的.所以不要这么写.
auto c = ++++++++s.begin();
//接下来是重头戏啦!!!
//advance算法的使用.
list<int> s = {1,3,5,7,9,11,13,15};
auto temp = s.begin();
//advance算法并没有返回值,只是在原有迭代器的基础上,进行了移动.
advance(temp, 4);
cout << *temp << endl; //输出结果为: 9.
//在现在的基础上:
advance(temp,-1);
cout << *temp << endl; //输出结果为: 7.
下面是advance的实现:
template <typename T>
void myAdvance(T &base, int len)
{
if (len >= 0)
{
for (int i = 0; i < len; ++i)
{
base++;
}
}
else
{
for (int i = len; i < 0; ++i)
{
base--;
}
}
}