文章目录
大多数算法都是定义在头文件algorithm中,通常这些算法不直接操作容器,一般都是通过迭代器来进行操作的。
1.只读算法
1.1 find()
find在容器中查找元素,如果元素查找成功则返回指向该元素的迭代器,如果查找不成功则返回end();
vector<string> v1 = { {"hello"},{"world"} };
vector<int>v2 = {1,2,3,4,5};
const string s = "hello";
auto ret1=find(v1.cbegin(),v1.cend(),s);//返回指向hello的迭代器
auto ret2 = find(v2.cbegin(), v2.cend(), 6);//返回指向v2.end()的迭代器
**find()可以用于数组**
int a[] = {1,2,4,5,6,7};
int* ret3 = find(begin(a), end(a), 4);
if (ret3 != end(a)) {
cout << *ret3 << endl;
}
else {
cout << "not find" << endl;
}
类似的函数还有count(),传参和find()一样,返回元素出现的次数。
1.2 accumulate()
该函数中同样传入三个参数,前两个参数表示求和范围,第三个参数表示初值。返回值由vector中保存的元素确定。
//字符串拼接
string sum = accumulate(v1.cbegin(),v1.cend(), string(""));
//数组求和
int sum1 = accumulate(begin(a), end(a), 0);
1.3 equal()函数
用于确定两个序列是否相等,返回值为bool值,三个参数分别为迭代器,前两个为第一个序列两端的迭代器,第三个参数为第二序列的begin();只接受单一的迭代器函数都假定第二个序列比第一个短。
int a[] = {1,2,4,5,6,7};
int b[] = {1,2,4};
bool r = equal(begin(a),begin(a)+3,begin(b));//返回值为true;
2.可写算法
2.1fill()
传入一个区间,在传入一个值val,fill()函数将这个区间全部填充为val。
fill(v1.begin(),v2.begin(),0);//将v1全部填充为0
因为是可写操作,所以传入的区间必须是有效的区间,这样才能保证写操作的安全性。
fill_n();
fill_n(v.begin(),10,0);//将从begin()开始的后10个元素置为0;
对于写操作来说,参数的区间范围很重要,否则可能未定义的范围内执行写操作。对于空的容器一定不能调用写操作的相关算法。
2.2back_inserter
该函数定义在头文件iterator中,该函数接受一个指向容器的引用,返回一个和该容器绑定的插入迭代器,当我们通过迭代器赋值时赋值运算会调用push_back将一个具有给定值的元素添加到容器中:
vector<int> vec;
auto it=back_inserter(vec);//通过它赋值会将元素添加到vec中
*it=10;//将10加入到vec中。
fill_n(back_inserter(vec),10,0);//向vec中添加10个0;
2.3 copy()
copy()有三个参数,将前两个参数的表示的区间的数据拷贝到第三个迭代器起始的位置及其以后的位置。
int a1[]={0,1,2,3,4,5,6,7};
int a2[8];
//将a1的元素拷贝到a2中
//ret返回拷贝完后a2的后一个位置
auto ret=copy(begin(a1),end(a1),begin(a2));
//返回的ret指向a2[8]的位置,所以使用ret时应该使用ret-1;
更多的算法请参考:
3.sort()算法
sort()是容器中用于排序的算法,默认方式按照升序的方式进行排序。
vector<int> vec = { 3,4,6,3,5,7,2,1 };
sort(vec.begin(),vec.end());//vec中的元素是将会有序排列
如果我们需要降序排序则我们需要如下这样操作。
int cmp(int val, int va2)
{
return val > va2;//如果返回的是Va1<va2则为升序排序
}
vector<int> vec = { 3,4,6,3,5,7,2,1 };
sort(vec.begin(),vec.end());
sort的第三个参数表示我们需要的排序方式。
我们可以不用指定自己的排序函数,在头文件中定义了相应的比较函数。greater(),和less();
所以上述程序可以改为:
sort(vec.begin(),vec.end(),less<int>());//升序排序
sort(vec.begin(),vec.end(),greater<int>());//降序排序
4.for_each();
for_each()算法在c++中用于遍历操作,但是它的第三个个参数是个谓词。
利用for_each()比遍历vector
void show(int i){
cout<<i<<" ";
}
vector<int>ve={1,3,4,6,5,8};
for_each(ve.begin(), ve.end(), show);
5.list和forward_list中的特定算法
对于链表操作应该优先使用其特有的操作,而不是使用通用操作。