关于c++ stl算法库的一些总结

只是总结了部分,详细请参考网站,单击访问
注:以下内容基于c++11

不修改序列的操作

  1. all_of any_of none_of

//以vector<int> 举例
//以上三个函数的参数都是(vi.begin(),vi.end(),cmp)
//其中前两个参数是范围,后面是判断的函数
//all_of返回一个范围内的数据是否   全部   满足cmp的判断
//none_of返回一个范围内的数据是否  都不  满足cmp的判断
//any_of 返回一个范围内的数据是否  存在  满足cmp的判断
#include<bits/stdc++.h>
using namespace std;

bool cmp(int a){
    
    //ÅжÏaÊÇ·ñÊÇżÊý
	return a%2==0;
}

bool cmp2(int a){
    
    //
	return a%2==1;
}

int main(){
    
    
	vector<int> vi;
	for(int i=0;i<10;++i){
    
    
		vi.push_back(i*2);
	}
	for(auto a:vi)cout<<a<<' ';
	if(all_of(vi.begin(),vi.end(),cmp))cout<<"yes";
	else cout<<"no";
	cout<<'\n';
	if(none_of(vi.begin(),vi.end(),cmp2))cout<<"yes";
	else cout<<"no";
	cout<<'\n';
	vi.push_back(1);
	if(any_of(vi.begin(),vi.end(),cmp2))cout<<"yes";
	else cout<<"no";
	return 0;
}




输出结果

0 2 4 6 8 10 12 14 16 18 yes
yes
yes

2mismatch

//以string举例
//参数(s.begin(),s.end(),s.rbegin())
前两个出纳室是第一个范围,后面一个是第二个范围的开始这里的s.rbegin()是反向遍历s

返回值:一个pair,分别装有两个范围的第一个不匹配的迭代器,如果匹配成功则返回第一个范围的end与第二个范围与之对应的位置

以下程序确定同时在给定字符串起始与在其结尾按逆序同时找到的最长子串(可能重叠)
#include <iostream>
#include <string>
#include <algorithm>
 
std::string mirror_ends(const std::string& in)
{
    
    
    return std::string(in.begin(),
                       std::mismatch(in.begin(), in.end(), in.rbegin()).first);
}
 
int main()
{
    
    
    std::cout << mirror_ends("abXYZba") << '\n'
              << mirror_ends("abca") << '\n'
              << mirror_ends("aba") << '\n';
}

该函数可自定义匹配函数
如下:
#include <iostream>
#include <string>
#include <algorithm>
 
bool cmp(char a,char b){
    
    
	return a==b;
}
std::string mirror_ends(const std::string& in)
{
    
    
    return std::string(in.begin(),
                       std::mismatch(in.begin(), in.end(), in.rbegin(),cmp).first);
}
 
int main()
{
    
    
    std::cout << mirror_ends("abXYZba") << '\n'
              << mirror_ends("abca") << '\n'
              << mirror_ends("aba") << '\n';
}

两程序效果相同

3 find find_if find_if_not

以vector<int>举例
参数
	(vi.begin(),vi.end(), t);第一个
	(vi.begin(),vi.end(),p);第二三个
注:t为需要寻找的值,p为符合要求的条件
返回值
指向首个满足条件的迭代器,或若找不到这种元素则为vi.end();
复杂度
至多应用 last - first 次。

举例:
#include<bits/stdc++.h>
using namespace std;

bool cmp(int x){
    
    
	return x>5;
}

int main(){
    
    
	vector<int> vi;
	for(int i=0;i<10;++i){
    
    
		vi.push_back(i);
	}
	auto i=find(vi.begin(),vi.end(),3);
	cout<<*i<<'\n';
	auto j=find_if(vi.begin(),vi.end(),cmp);
	cout<<*j<<'\n';
	auto k=find_if_not(vi.begin(),vi.end(),cmp);
	cout<<*k<<'\n';
	return 0;
}

输出结果:
3
6
0


4 find_end

以vector<int> 举例
参数
(v.begin(), v.end(), t1.begin(), t1.end())
返回值
指向范围 [first, last)[s_first, s_last) 最后一次出现的开端的迭代器
复杂度
至多比较 S*(N-S+1) 次,其中
 S = distance(s_first, s_last) 
 而 N = distance(first, last)#include <algorithm>
#include <iostream>
#include <vector>
 
int main()
{
    
    
    std::vector<int> v{
    
    1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4};
    std::vector<int>::iterator result;
 
    std::vector<int> t1{
    
    1, 2, 3};
 
    result = std::find_end(v.begin(), v.end(), t1.begin(), t1.end());
    if (result == v.end()) {
    
    
        std::cout << "subsequence not found\n";
    } else {
    
    
        std::cout << "last subsequence is at: "
                  << std::distance(v.begin(), result) << "\n";
    }
 
    std::vector<int> t2{
    
    4, 5, 6};
    result = std::find_end(v.begin(), v.end(), t2.begin(), t2.end());
    if (result == v.end()) {
    
    
        std::cout << "subsequence not found\n";
    } else {
    
    
        std::cout << "last subsequence is at: " 
                  << std::distance(v.begin(), result) << "\n";
    }
}




输出:
last subsequence is at: 8
subsequence not found

5find_first_of

以vector<int>举例
参数:(v.begin(), v.end(), t.begin(), t.end())

返回值
指向范围 [v.begin(), v.end()) 中等于来自范围 [t.begin(),t.end()) 中一个元素的首个元素。若找不到这种元素,则返回 v.end() 。

复杂度
至多做 (S*N) 次比较,其中 S = distance(v.begin(),  v.end()) 而 N = distance(t.begin(), t.end()) 


举例:
#include <algorithm>
#include <iostream>
#include <vector>
 
int main()
{
    
    
    std::vector<int> v{
    
    0, 2, 3, 25, 5};
    std::vector<int> t{
    
    3, 19, 10, 2};
 
    auto result = std::find_first_of(v.begin(), v.end(), t.begin(), t.end());
 
    if (result == v.end()) {
    
    
        std::cout << "no elements of v were equal to 3, 19, 10 or 2\n";
    } else {
    
    
        std::cout << "found a match at "
                  << std::distance(v.begin(), result) << "\n";
    }
 }


输出:
found a match at 1



解释:就是在v中从头往后寻找一个同时满足在v和在t中的元素

持续更新ing

猜你喜欢

转载自blog.csdn.net/qq_36738806/article/details/126910454