STL容器算法主要有:、、组成
algorithm主要有遍历、比较、交换、查找、拷贝、修改等;
numeric体积很小,主要包括几个序列上的进行数学运算的函数模板;
functional定义了一些模板类,用于声明仿函数;
1.遍历容器for_each
for_each()函数用于完成容器遍历,函数参数如下:
for_each(_InIt _First, _InIt _Last, _Fn _Func)
形参:_First、_Last --容器的起始和结束迭代器
_Func -->仿函数(回调函数),处理要输出的信息
1.1 vector容器遍历
自定义数据格式:
class Person
{
friend class mycompare;
friend class Myprint;//友元类
friend void Print(const Person& p);//友元函数
public:
Person() {}
Person(string name, int age) :name(name), age(age) {
}
Person(const Person& p)
{
name = p.name;
age = p.age;
}
bool operator< (const Person& p)const
{
if (this- >age == p.age)
{
return p.name < p.name;
}
return this- >age > p.age;
}
private:
string name;
int age;
};
//创建函数对象
class Myprint
{
public:
void operator()(const Person& p)
{
cout < < "姓名:" < < p.name < < "t年龄:" < < p.age < < endl;
}
void operator()(const pair< Person, int >& p)
{
cout < < "姓名:" < < (p.first).name < < "t年龄:" < < (p.first).age < < "t成绩:" < < p.second < < endl;
}
};
void vector_test()
{
cout < < "tvector容器示例:" < < endl;
//创建vector容器--- >单端数组
vector< Person >vtr;
vtr.push_back(Person("小王", 18));
vtr.push_back(Person("小林", 18));
vtr.push_back(Person("小李", 18));
vtr.push_back(Person("小刘", 18));
cout < < "提供一个函数示例:" < < endl;
for_each(vtr.begin(), vtr.end(), Print);
cout < < "提供一个仿函数示例:" < < endl;
for_each(vtr.begin(), vtr.end(), Myprint());
}
1.2 list容器遍历
void list_test()
{
//创建一个list容器-->双向链表
cout < < "tlist容器示例:" < < endl;
list< Person > t;
t.push_back(Person("小王", 18));//尾插
t.push_front(Person("小林", 18));//头插
t.push_back(Person("小李", 18));
t.push_back(Person("小刘", 18));
cout < < "提供一个仿函数示例:" < < endl;
for_each(t.begin(), t.end(), Myprint());
}
1.3 set容器遍历
void set_test()
{
cout < < "tset/multiset关联式容器:" < < endl;
multiset< Person >mt;//该容器会自动排序
mt.insert(Person("小王", 18));
mt.insert(Person("小林", 18));
mt.insert(Person("小李", 17));
mt.insert(Person("小刘", 18));
mt.insert(Person("小李", 22));
for_each(mt.begin(), mt.end(), Myprint());
cout < < "tset/multiset关联式容器(仿函数示例):" < < endl;
multiset< Person, mycompare >mt2;
mt2.insert(Person("小王", 18));
mt2.insert(Person("小林", 18));
mt2.insert(Person("小李", 17));
mt2.insert(Person("小刘", 18));
mt2.insert(Person("小李", 22));
for_each(mt.begin(), mt.end(), Myprint());
}
1.4 map容器遍历
void map_test()
{
cout < < "tmap关联式容器示例:" < < endl;
multimap< Person, int >mp;
mp.insert(make_pair(Person("小王", 18), 88));
mp.insert(pair< Person,int >(Person("小林", 18),99));
mp.insert(pair< Person, int >(Person("小李", 17), 95));
mp.insert(pair< Person, int >(Person("小刘", 18), 95));
mp.insert(pair< Person, int >(Person("小李", 22), 90));
for_each(mp.begin(), mp.end(), Myprint());
}
1.5 整体运行效果
int main()
{
vector_test();//vector容器
list_test();//list容器
set_test();//set容器
map_test();//map容器
system("pause");
}
2.转移元素transform
transform函数:
transform(const _InIt _First, const _InIt _Last, _OutIt _Dest, _Fn _Func)
将一个函数中的元素拷贝到另一个容器中,
_First、_Last --要转移的容器的起始迭代器和结束迭代器
_Dest --目标容器的起始迭代器
_Func --仿函数,支持一元运算,可以对当前值进行+ - * 等各种运算
使用示例:
#include < iostream >
using namespace std;
#include < algorithm >
#include < vector >
class myprint
{
public:
void operator()(int val)
{
cout < < val < < " ";
}
};
class myfunc
{
public:
int operator()(int val1)
{
return val1;
}
};
void test()
{
vector< int >t1;
for (int i = 0; i < 10; i++)
{
int temp = rand() % 101;
t1.push_back(temp);
}
cout < < "原容器数据:" < < endl;
for_each(t1.begin(), t1.end(), myprint());
cout < < endl;
vector< int >target;
target.resize(t1.size());//设置target容器大小
transform(t1.begin(), t1.end(), target.begin(), myfunc());
cout < < "转移后的容器内容:" < < endl;
for_each(target.begin(), target.end(), myprint());
cout < < endl;
}
int main()
{
test();
system("pause");
}
3.成员查找
STL中支持多种查找方式。
- find() --查找指定元素
- find_if() --按条件查找
- adjacend_find() --查找相邻元素
- binary_search() --二分法查找
- count() --统计元素个数
- count_if() --按条件统计
3.1 find查找
find函数:
find(_InIt _First, const _InIt _Last, const _Ty& _Val);
_First、_Last --查找的起始和结束位置
_Val --要查找的内容
返回值:成功返回查找到位置的迭代器
失败返回end();
#include < iostream >
using namespace std;
#include < algorithm >
#include < vector >
#include < list >
#include < stack >
#include < map >
class Person
{
friend class map_compare;
friend class print;
friend ostream& operator< <(ostream& cout, const Person& p);
public:
Person(){}
Person(string name, int age):name(name),age(age) {
}
bool operator==(const Person& p)const
{
if (name == p.name && age == p.age)return true;
return false;
}
bool operator< (const Person& p)const
{
if (p.age == age)
{
return name < p.name;
}
return age > p.age;
}
private:
string name;
int age;
};
ostream& operator< <(ostream& cout, const Person& p)
{
cout < < "姓名:" < < p.name < < "t年龄:" < < p.age ;
return cout;
}
class print
{
public:
void operator()(const Person& p) {
cout < < "姓名:" < < p.name < < "t年龄:" < < p.age < < endl;
}
};
void vec_test()
{
cout < < "tvector容器查找示例:" < < endl;
vector< Person >vtr;
vtr.push_back(Person("小王", 18));
vtr.push_back(Person("小刘", 17));
vtr.push_back(Person("小李", 22));
vtr.push_back(Person("小林", 19));
for_each(vtr.begin(),vtr.end(),print());
vector< Person >::iterator ret=find(vtr.begin(), vtr.end(), Person("小刘", 17));
if (ret == vtr.end())
{
cout < < "未找到该成员" < < endl;
}
else
{
cout < < "查找成功: " < < endl;
cout < < *ret < < endl;;
}
}
void list_test()
{
cout < < "nlist容器使用示例:" < < endl;
list< Person >t;
t.push_back(Person("小王", 18));
t.push_front(Person("小刘", 17));
t.insert(t.end(),Person("小王", 18));
t.insert(t.begin(), Person("小王", 18));
t.push_back(Person("小李", 22));
t.push_back(Person("小林", 19));
for_each(t.begin(), t.end(), print());
cout < < "查找成员Person("小王", 18)" < < endl;
int count = 0;
for (list< Person >::iterator ptr = t.begin();ptr != t.end(); )
{
ptr =find(ptr, t.end(), Person("小王", 18));
if (ptr != t.end())
{
cout < < "查找到第 " < < ++count < < "成员:";;
cout < < *ptr < < endl;
ptr++;
}
}
}
//栈容器
void stack_test()
{
cout < < "stack容器查找示例:" < < endl;
//stack栈:先进后出
stack< Person >s;
s.push(Person("小王", 18));
s.push(Person("小刘", 17));
s.push(Person("小李", 22));
s.push(Person("小林", 19));
s.push(Person("小王", 18));
cout < < "元素个数:" < < s.size() < < endl;
while (!s.empty())//判断容器是否为空
{
if (s.top() == Person("小王", 18))
{
cout < < "查找成功" < < endl;
}
s.pop();//出栈
}
}
class map_print
{
public:
void operator()(const pair< Person, int >& p)
{
cout < < p.first < < "t成绩:" < < p.second < < endl;
}
};
class map_compare
{
public:
bool operator()(const pair< Person, int >& p1, const pair< Person, int >& p2)
{
if (p1.first == p2.first && p1.second == p2.second)return true;
return false;
}
};
//map容器
void multimap_test()
{
cout < < "nmap容器查找示例:" < < endl;
multimap< Person, int >mp;
//插入数据
mp.insert(pair< Person, int >(Person("小王", 18), 88));
mp.insert(make_pair(Person("小刘", 17), 99));
mp.insert(multimap< Person, int >::value_type(Person("小王", 18), 100));
mp.insert(make_pair(Person("小李", 19), 95));
for_each(mp.begin(), mp.end(), map_print());
cout< < "查找成员Person("小王", 18)" < < endl;
multimap< Person, int >::iterator ret = mp.find(Person("小王", 18));//查找数据
map_print p;
//multimap容器由于数据都是有序的,所以相同的数据都是连在一起的
for (int i = 0; i < mp.count(Person("小王", 18)); i++, ret++)
{
if (ret != mp.end())
{
p(*ret);
}
}
}
class stu
{
public:
stu() {}
stu(string name, int age) :name(name), age(age) {
}
bool operator==(const stu& p)const
{
if (name == p.name && age == p.age)return true;
return false;
}
bool operator< (const stu& p)const
{
if (p.age == age)
{
return name < p.name;
}
return age > p.age;
}
string name;
int age;
};
int main()
{
vec_test();
list_test();
stack_test();
multimap_test();
system("pause");
}
#endif
3.2 find_if条件查找
find_if(_InIt _First, const _InIt _Last, _Pr _Pred)
形参:_First、_Last --查找的起始和结束迭代器
_Pred --仿函数,查找条件
返回值:成功返回查找到的成员的位置迭代器
失败返回endl
#include < iostream >
#include < vector >
#include < map >
#include < algorithm >
#include < functional >
using namespace std;
class Person
{
friend std::ostream& operator< <(std::ostream& cout, Person& p);
friend class compare;
friend class print;
public:
Person() {}
Person(std::string name, int age) :name(name), age(age) {
}
bool operator >(const Person& p)const
{
return age > p.age;
}
private:
std::string name;
int age;
};
std::ostream& operator< <(std::ostream& cout, Person& p)
{
cout < < "姓名:" < < p.name < < "t年龄" < < p.age;
return cout;
}
class compare
{
public:
bool operator()(const Person& p)
{
return p.age > 18;
}
bool operator()(const Person& p1, const Person& p2)const
{
if (p1.age == p2.age)return p1.name < p2.name;
return p1.age < p2.age;
}
};
class print
{
public:
void operator()(pair< Person, int >p)
{
cout < < p.first < < "t成绩" < < p.second < < endl;
}
};
void vector_test()
{
cout < < "vector容器条件查找示例:" < < endl;
std::vector< Person > vtr;
vtr.push_back(Person("小王", 18));
vtr.push_back(Person("小刘", 17));
vtr.push_back(Person("小李", 22));
vtr.push_back(Person("小林", 19));
std::cout < < "查找年龄大于18的成员:" < < std::endl;
std::vector< Person >::iterator ret=find_if(vtr.begin(), vtr.end(), compare());
if (ret != vtr.end())
{
std::cout < < "查找成功" < < std::endl;
std::cout < < *ret < < std::endl;
}
}
void multimap_test()
{
cout < < "nmultimap条件查找示例:" < < endl;
multimap< Person, int, compare >p;
p.insert(make_pair(Person("小王", 18), 88));
p.insert(make_pair(Person("小刘", 17), 99));
p.insert(make_pair(Person("小刘", 17), 77));
p.insert(make_pair(Person("小林", 17), 77));
p.insert(make_pair(Person("小李", 22), 100));
for_each(p.begin(), p.end(), print());
cout < < "查找年龄Person("小刘", 17)" < < endl;
pair< multimap< Person,int >::iterator,multimap< Person,int >::iterator> ret=p.equal_range(Person("小刘", 17));
for (; ret.first != ret.second;ret.first++)
{
print temp;
temp(*(ret.first));
}
}
int main()
{
vector_test();
multimap_test();
system("pause");
}
3.3 find_if条件查找
adjacent_find() -查找相邻重复元素,查找成功返回相邻重复元素的首位置的迭代器,失败返回end
iterator adjacent_find(const _FwdIt _First, _FwdIt _Last, _Pr _Pred)
形参:_First、_Last --要查找的起始、结束区间迭代器
_Pred --查找条件
返回值:成功返回相邻重复元素的首位置的迭代器
失败返回end
示例:
#include < iostream >
#include < algorithm >
#include < vector >
#include < map >
using namespace std;
class Person
{
friend ostream& operator< <(ostream& cout, Person& p);
public:
Person(string name, int age) :name(name), age(age) {
}
bool operator==(Person& p)
{
if (p.age == this- >age && p.name == name)return true;
return false;
}
string name;
int age;
};
ostream& operator< <(ostream& cout, Person& p)
{
cout < < "姓名:" < < p.name < < "t年龄:" < < p.age;
return cout;
}
class compare
{
public:
bool operator()(const Person& p1, const Person& p2)const
{
if (p1.name == p2.name && p1.age == p2.age)return true;
return false;
}
};
void vector_test()
{
cout < < "tvector容器使用示例!" < < endl;
vector< Person >vtr;
vtr.push_back(Person("小王", 18));
vtr.push_back(Person("小刘", 18));
vtr.push_back(Person("小王", 18));
vtr.push_back(Person("小王", 18));
vtr.push_back(Person("小李", 18));
auto ret=adjacent_find(vtr.begin(), vtr.end(), compare());
if (ret != vtr.end())
{
cout < < "查找成功:";
cout < < *ret < < endl;
}
}
class print
{
public:
void operator()( pair< Person, int > p)const
{
cout < < p.first < < "t成绩:" < < p.second < < endl;
}
};
class mapcompare
{
public:
bool operator()(const Person& p1, const Person& p2)const
{
if ( p1.age == p2.age)return p1.name< p2.name;
return p1.age< p2.age;
}
bool operator()(const Person& p)
{
return p.age > 17;
}
};
void mulitmap_test()
{
cout < < "ntmultimap使用示例!" < < endl;
multimap< Person, int, mapcompare >mp;
mp.insert(make_pair(Person("小王", 16), 77));
mp.insert(make_pair(Person("小刘", 18), 88));
mp.insert(make_pair(Person("小刘", 18), 88));
mp.insert(make_pair(Person("小李", 19), 99));
cout < < "元素个数:" < < mp.size() < < endl;
for_each(mp.begin(), mp.end(), print());
auto begin=mp.lower_bound(Person("小刘", 18));
auto end = mp.upper_bound(Person("小刘", 18));
cout < < "查找相邻重复内容Person("小刘", 18):" < < endl;
for (; begin != end; begin++)
{
print p;
p(*begin);
}
}
int main()
{
vector_test();
mulitmap_test();
system("pause");
}
3.4 二分法查找binary_search
二分法查找元素:
bool binary_search(val); -->查找成功返回true,失败返回false,保证数据顺序为从小到大
binary_search(_FwdIt _First, _FwdIt _Last, const _Ty& _Val, _Pr _Pred)
形参:_First、_Last --起始和结束迭代器
_Val --要查找的内容
_Pred --数据顺序方式(默认从小到大)
注意:调用该函数必须保证有序,否结果可能不准确
#include < iostream >
#include < vector >
#include < algorithm >
#include < functional >
using namespace std;
class Print
{
public:
void operator()(int v1)
{
cout < < v1 < < " ";
}
};
void test()
{
vector< int >vtr;
vtr.push_back(10);
vtr.push_back(3);
vtr.push_back(6);
vtr.push_back(2);
vtr.push_back(5);
cout < < "从小到大排序:" < < endl;
sort(vtr.begin(), vtr.end(), less< int >());
for_each(vtr.begin(), vtr.end(), Print());
cout < < endl;
auto ret=binary_search(vtr.begin(), vtr.end(), 5);
if (ret)
{
cout < < "查找5:查找成功" < < endl;
}
}
int main()
{
test();
system("pause");
}
3.5 查找个数count
查找指定成员个数:
count(const _InIt _First, const _InIt _Last, const _Ty& _Val)-->返回查找到的个数
形参:_First、_Last --起始和结束迭代器
_Val --要查找的内容
返回值:返回查找到的个数
示例:
#include < iostream >
using namespace std;
#include < vector >
#include < algorithm >
class Person
{
public:
Person() {}
Person(string name, int age) :name(name), age(age) {
}
bool operator==(const Person p)const
{
if (age == p.age && name == p.name)return true;
return false;
}
bool operator==(const int age)const
{
if (this->age == age)return true;
return false;
}
string name;
int age;
};
class compare
{
public:
bool operator()(const Person p1, const Person p2)const
{
if (p1.age == p2.age && p1.name == p2.name)return true;
return false;
}
};
void test()
{
vector< Person > vtr;
vtr.push_back(Person("小王", 18));
vtr.push_back(Person("小刘", 22));
vtr.push_back(Person("小王", 18));
vtr.push_back(Person("小林", 17));
vtr.push_back(Person("小王", 18));
vtr.push_back(Person("小蒋", 20));
auto cnt=count(vtr.begin(), vtr.end(), Person("小王", 18));
cout < < "符合要求的成员个数:" < < cnt < < endl;
cnt = count(vtr.begin(), vtr.end(), 22);
cout < < "年龄等于22的个数:" < < cnt < < endl;
}
int main()
{
test();
system("pause");
}
3.5 查找个数count
按条件查找:
count_if(_InIt _First, _InIt _Last, _Pr _Pred);--返回查找到个数
形参:_First、_Last --起始和结束迭代器
_Pred --查找条件
返回值:返回查找到的元素位置的迭代器
失败返回end()
#include < iostream >
#include < algorithm >
#include < vector >
using namespace std;
class Person
{
public:
Person() {}
Person(string name, int age) :name(name), age(age) {
}
string name;
int age;
};
class Compare
{
public:
bool operator()(const Person& p)const
{
if (p.name == "小王" && p.age > 18)return true;
return false;
}
};
void test()
{
vector< Person >vtr;
vtr.push_back(Person("小王", 18));
vtr.push_back(Person("小刘", 22));
vtr.push_back(Person("小王", 19));
vtr.push_back(Person("小林", 17));
vtr.push_back(Person("小王", 22));
vtr.push_back(Person("小蒋", 20));
auto ret=count_if(vtr.begin(), vtr.end(), Compare());
cout < < "姓名为小王,年龄大于18的个数:" < < ret< ;>
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
算法
+关注
关注
23文章
4593浏览量
92546 -
函数
+关注
关注
3文章
4290浏览量
62346 -
容器
+关注
关注
0文章
492浏览量
22029 -
C++
+关注
关注
21文章
2102浏览量
73460 -
STL
+关注
关注
0文章
85浏览量
18292
发布评论请先 登录
相关推荐
c语言入门知识之STL篇
这周终于可以给大家把STL方面的面试题总结出来了,突然发现它里面的细节非常多,只有你想不到的,没有它没有的。对于C++程序员来说,STL库里面的知识也是非常重要的,只要想在技术这条路线上有长远的发展,那么就一定要掌握它。不管是学
C++ STL的概念及举例
本篇文章是作者本人使用STL 后的一些看法, 对於想要靠此文章学习STL, 是不可能的. 建议叁后面介绍的一些书入门.
STL的概念
在STL 中, 大至上分三个主要的
发表于 08-30 11:39
•1399次阅读
STL算法在GIS中的应用
使用STL 算法实现GIS 算法可以保证它的简洁和高效该文结合C++代码实例抽象出了地理算子的概念应用在GIS 算法当中通过定制适配器来消除
发表于 06-28 16:55
•33次下载
C++课程资料详细资料合集包括了:面向对象程序设计与C++,算法,函数等
本文档的主要内容详细介绍的是C++课程资料资料合集包括了:面向对象程序设计与C++,算法,函数,概述, C++语言基础,构造数据类型,数据类型,C+
发表于 07-09 08:00
•18次下载
C++程序设计教程之性能的详细资料课件说明
本文档的详细介绍的是C++程序设计教程之性能的详细资料课件说明主要内容包括了: 1. 内联函数 ( Inline Functions ), 2.数据结构 ( Data Structures
发表于 02-21 17:19
•2次下载
C++17 STL标准库学习教材电子书免费下载
C++标准模板库(STL)。这本书中的例子展示了如何充分的利用STL。不过,作为本书的第1章,我们还是需要了解一下那些比较重要的新语言特性。
发表于 02-28 08:00
•7次下载
C++ STL基本概念是什么
STL,英文全称 standard template library,中文可译为标准模板库或者泛型库,其包含有大量的模板类和模板函数,是 C++ 提供的一个基础模板的集合,用于完成诸如输入/输出、数学计算等功能。
C++入门之通用算法
C++ 是一种强大的编程语言,它提供了许多通用算法,可以用于各种容器类型。这些算法是通过迭代器来操作容器中的元素,因此它们是通用的,可以用于不同类型的容器。在本篇博客中,我们将详细介绍 C++
评论