STL算法是对容器进行处理的函数。
STL提供了大约100个实现算法的模版函数,比如算法for_each将为指定序 列中的每一个元素调用指定的函数,stable_sort以你所指定的规则对序列进行稳定性排序等等。
头文件
#include
#include
查找类算法
查找类算法 | 算法作用 |
---|---|
find(beg,end val) | 利用底层元素的等于操作符,对指定范围内的元素与输入值进行比较。当匹配时,结束搜索,返回该元素的 一个迭代器。 |
find_end(beg,end,beg2,end2) | 在迭代区间[beg,end) 内查找与区间[beg2, end2) 内任意元素匹配的元素,然后返回一个迭代器,指向最后一个匹配的元素。如果找不到元素,则返回第一个范围的end迭代器 |
find_first_of(beg,end,beg2,end2) | 与find_ first_ of类似,区别:查找最后一个匹配的元素。 |
find_if(beg,end,val) | 与find类似查找的不是一个值还是达成条件的值 |
直接代码加注释
template <typename IT,typename T>//模板实现find算法
IT mfind(const IT& first, const IT& last, const T& val)//返回类型迭代器
{
IT tmp = first;//const允许修改定义零时变量
while (tmp != last)
{
if (*tmp == val)
{
return tmp;
}
tmp++;
}
return last;
}
template <typename IT ,typename PRE>//模板实现find_if函数
IT mfind_if(const IT& first, const IT& last, PRE pre)//find_if 返回迭代器
{
IT tmp = first;//因为有const所以定义IT零时变量 tmp
while (tmp != last)
{
if (pre(*tmp))
{
return tmp;
}
tmp++;
}
return last;
}
int main()
{
vector<int> v1;//创建vector容器 v1
for (int i = 0; i < 10; i++)
{
v1.push_back(i + 1);//初始化v1
}
cout << "用流式迭代器打印v1" << endl;
copy(v1.begin(), v1.end(), ostream_iterator<int>(cout, " "));
cout << endl;
cout << "使用find算法查询数字5" << endl;
vector<int>::iterator it = find(v1.begin(), v1.end(), 5);
if (it == v1.end())
{
cout << "not find" << endl;
}
else
{
cout << *it << endl;
}
vector<int> v2;//创建int类型vector v2
copy(v1.begin(), v1.begin() + 4, inserter(v2, v2.begin()));//用copy对v2进行初始化,将v1.begin()到v1.begin()+4拷贝到v2
cout << "打印初始化v2" << endl;
copy(v2.begin(), v2.end(), ostream_iterator<int>(cout, " "));//用流式迭代器打印v2
cout << endl;
cout << "使用fing_end算法进行查找:" << endl;
vector<int>::iterator it1 = find_end(v1.begin(), v1.end(), v2.begin(),v2.end());
if (it1 == v1.end())
{
cout << "not find" << endl;
}
else
{
cout << *it1 << endl;
}
cout << "自己实现的find算法:" << endl;
vector<int>::iterator it2 = mfind(v1.begin(), v1.end(), 5);//使用自己实现的find算法进行查找
if (it1 == v1.end())
{
cout << "not find" << endl;
}
else
{
cout << *it2 << endl;
}
return 0;
}
排序类算法
排序类算法 | 算法作用 |
---|---|
sort (beg,end) | 区间[beg,end) 内元素按字典次序排列 |
stable_ sort(beg, end, func) | 同上,不过保存相等元素之间的顺序关系 |
partial_ sort (beg,mid, end) | 将最小值顺序放在[beg,mid)内 |
random_ shuffle (beg,end) | 区间内元素随意排序 |
reverse (beg,end) | 将区间内元素反转 |
rotate(beg,mid ,end) | 将区间[beg, mid) 和[mid, end)旋转,使mid为新的起点 |
merge(beg, end, beg2. end2,nbeg) | 将有序区间[beg, end)和[beg2, end2)合 并到一个新的序列nbeg中,并对其排序 |
vector<int>v1;
for (int i = 10; i > 0; i--)
{
v1.push_back(i);
}
cout << "v1初始化容器内元素顺序" << endl;
copy(v1.begin(), v1.end(), ostream_iterator<int>(cout, " "));
cout << endl;
cout << "使用sort排序之后:" << endl;
sort(v1.begin(), v1.end());
copy(v1.begin(), v1.end(), ostream_iterator<int>(cout, " "));
cout << endl;
cout << "使用reverse进行翻转:" << endl;
reverse(v1.begin(), v1.end());
copy(v1.begin(), v1.end(), ostream_iterator<int>(cout, " "));
可变序列算法 | 算法作用 |
---|---|
copy(beg,end, beg2) | 将迭代区间[beg, end) 元素复制到以beg2 开始的区间 |
transform (beg, end, beg2, func) | 功能同上,只是每个元素需要经过函数func处理 |
repl ace(beg, end, v1, v2) | 将区间[beg,end)内等于 v1的元素替换为v2 |
fill (beg,end, v) | 区间内元素都写入v |
fill_ _n(beg, n, v) | 从位置beg开始的n个元素写入v |
generate (beg,n,rand) | 向从beg开始的n个位置随机填写数据 |
remove (beg,end) | 移除区间[beg,end)内的元素, 注意:并不真正删除 |
unique(beg,end) | 剔除相邻重复的元素,注意:并不真正删除 |
vector<int>v1;
for (int i = 10; i > 0; i--)
{
v1.push_back(i);
}
cout << "v1初始化容器内元素顺序" << endl;
copy(v1.begin(), v1.end(), ostream_iterator<int>(cout, " "));
cout << endl;
vector<int>v2;
cout << "用copy初始化v2" << endl;
copy(v1.begin(), v1.begin() + 4, inserter(v2, v2.begin()));//用copy对v2进行初始化,将v1.begin()到v1.begin()+4拷贝到v2
copy(v2.begin(), v2.end(), ostream_iterator<int>(cout, " "));
cout << "用fill算法将v1值改为5" << endl;
fill(v1.begin(), v1.end(), 5);
copy(v1.begin(), v1.end(), ostream_iterator<int>(cout, " "));
关系算法 | 算法作用 |
---|---|
equal (beg, end, beg2,end2) | 判断两个区间元素是否相等 |
includes (beg,end,beg2,end2) | 判断[beg,end) 序列是否被第二个序列[beg2, end2) 包含 |
max_ element (beg, en) | 返回序列最大元素的位置 |
min_ element (beg, end) | 返回序列最小元素的位置 |
mismatch (beg,end,beg2,end2) | 查找两个序列中第- -一个不匹配的元素,返回一对iterator,标记第一个不匹配元素的位置 |
注意:使用includes前必须先进行排序 |
vector<int>v1;
for (int i = 10; i > 0; i--)
{
v1.push_back(i);
}
cout << "v1初始化容器内元素顺序" << endl;
copy(v1.begin(), v1.end(), ostream_iterator<int>(cout, " "));
cout << endl;
vector<int>v2;
cout << "用copy初始化v2" << endl;
copy(v1.begin(), v1.begin() + 4, inserter(v2, v2.begin()));//用copy对v2进行初始化,将v1.begin()到v1.begin()+4拷贝到v2
copy(v2.begin(), v2.end(), ostream_iterator<int>(cout, " "));
cout << endl;
cout << "使用equal判断v1,v2" << endl;
cout<<equal(v1.begin(), v1.end(), v2.begin(), v2.end());
cout << endl;
cout << "使用includes判断v1包含v2" << endl;
sort(v1.begin(), v1.end());//先排序
sort(v2.begin(), v2.end());
if (includes(v2.begin(), v2.end(), v1.begin(), v1.end()))
{
cout << "include" << endl;
}
else
{
cout << "not include" << endl;
}
堆算法
堆算法 | 算法作用 |
---|---|
make_ heap (beg,end) | 以区间[beg,end)内元素建立堆 |
pop_ heap (beg,end) | 重新排序堆,使第-一个与最后- 一个交换,并不真正弹出最大值 |
push_ heap(beg, end) | 重新排序堆,把新元素放在最后一个位置 |
sort_ heap(beg, end) | 对序列重新排序 |
vector<int> v;
v.push_back(3);
v.push_back(9);
v.push_back(17);
v.push_back(20);
v.push_back(12);
make_heap(v.begin(), v.end()); //用 vector 代替数组建立最大堆
cout << "堆前: ";
for (vector<int>::iterator iter = v.begin(); iter != v.end(); ++iter)
cout << *iter << " ";
cout << endl;
cout << "堆排序后: ";
sort_heap(v.begin(), v.end()); //堆排序
for (vector<int>::iterator iter = v.begin(); iter != v.end(); ++iter)
cout << *iter << " ";