首页 > 编程语言 >C++头文件<algorithm>中常用函数简介

C++头文件<algorithm>中常用函数简介

时间:2024-09-01 17:55:23浏览次数:8  
标签:std 头文件 cout int 简介 C++ container using include

  概述

  头文件algorithm(算法库)中主要提供了一些对容器操作的函数,如排序、搜索、复制、比较等,因此使用频率还是很高的,由于主要是操作容器,所以函数的语法也很类似:

algorithm_name(container.begin(), container.end(), ...);

  其中,container.begin()和container.end()分别表示指向容器开头和结尾的迭代器,对于数组来说,则是数组的首地址和尾地址(当然,不一定非得是首和尾,也可以是中间的某个范围)

1. 排序sort

  sort函数可以对容器进行排序,其基本语法为

sort(container.begin(), container.end(), compare_function);

  例如:

#include <iostream>
#include <algorithm> 
using namespace std;
int main()
{
    int a[5] = {2,1,4,3,5};
    sort(a,a+5);
    for(int i:a){
        cout<<i<<endl;
    }  
}
// 输出为 1 2 3 4 5

  也可以对数组中的某一部分进行排序:

#include <iostream>
#include <algorithm> 
using namespace std;
int main()
{
    int a[5] = {2,1,4,3,5};
    //注意这个地址区间是左闭右开的 
    sort(a+2,a+5);
    for(int i:a){
        cout<<i<<endl;
    } 
}
// 输出为2 1 3 4 5

  除此之外,sort还支持传入一个回调函数作为参数来自定义比较规则,该函数在自定义时,最好定义返回类型为bool,两个形参,表示比较的双方。例如,sort默认是升序排列的,我们可以通过改变比较规则来实现降序排列的效果:

#include <iostream>
#include <algorithm> 
using namespace std;
// 自定义比较规则函数 bool f(int i,int j){ return i>j; } int main() { int a[5] = {2,1,4,3,5}; sort(a,a+5,f); for(int i:a){ cout<<i<<endl; } }
// 输出结果为5 4 3 2 1

2. 查找find

  find可用于在容器指定范围内查找元素,若能找到,则返回第一个匹配的元素指针,若不能找到,将固定返回container.end()。作用和python中的关键字in比较类似,但用法差异较大。其基本语法为:

auto it = find(container.begin(), container.end(), value);

  基本的用法:

#include <iostream>
#include <algorithm> 
using namespace std;

int main()
{
    int a[5] = {2,1,4,3,5};
    //这里注意返回的是一个指针,同样可以指定查找的范围 
    int* index = find(a,a+5,3);
    //这里能找到,所以将输出3,若不能找到,*index会固定输出参数值,但index始终是数组的末尾指针 
    cout<<*index;
}

  find常用于判断某个元素是否存在于容器中:

#include <iostream>
#include <algorithm> 
using namespace std;

int main()
{
    int a[5] = {2,1,4,3,5}; 
    int* index = find(a,a+5,6);
       if(index!=a+5){
           cout<<"该元素在数组中"<<endl; 
       }
    else{
        cout<<"该元素不在数组中"<<endl; 
    }
}
// 输出结果为: 该元素不在数组中

3. 复制copy

  copy用于将容器中指定范围内的元素复制到另一个容器中,这里的拷贝是浅拷贝,也就是只拷贝值,不拷贝引用,其基本语法为:

copy(source_begin, source_end, destination_begin);

  source表示源容器,destination表示目标容器

#include <iostream>
#include <algorithm> 
using namespace std;

int main()
{
    int a[5] = {2,1,4,3,5}; 
    int b[8] = {1,1,1,1,1,1,1,1};
    /**
     复制的时候要注意:
     若源数据的个数多于b的容量,则会报错 
     若源数据的个数小于等于b的容量,则会从b的头部开始替换元素 
     **/
    copy(a,a+5,b);
    for(int i:b){
        cout<<i<<" ";
    } 
}
// 输出结果为:2 1 4 3 5 1 1 1

  需要注意的是,像数组和vector这种不同的数据结构,因为底层的存储逻辑是有区别的,所以不能相互复制。

4. 比较equal

  如果有两个数组,a[5]={1,2,3,4,5},b[5]={1,2,3,4,5},如果我们想判断这两个数组中的元素是否相等,直接写a==b当然是不行的,因为这样比较的是两个数组的地址,结果一定是假。如果要比较两个容器中或两个范围内的元素是否相等,就需要使用equal函数,其基本语法为:

bool result = equal(first1, last1, first2, compare_function);

  仔细观察可以发现,没有传第二个范围的终止值,因为这里会自动地取和第一个范围相同的长度。

#include <iostream>
#include <algorithm> 
using namespace std;

int main()
{
    int a[5] = {1,2,3,4,5}; 
    int b[5] = {1,2,3,4,5};
    //cout<<(a==b)输出结果是0 
    bool result = equal(a,a+5,b);
    cout<<result<<endl;
}
// 输出结果为1 

  既然在用法中说明了,可以用于两个范围,所以也可以判断同一个容器中两个范围内的元素是否相等

#include <iostream>
#include <algorithm> 
using namespace std;

int main()
{
    int a[6] = {1,2,3,1,2,3}; 
    bool result = equal(a,a+3,a+3);
    cout<<result<<endl;
}
// 输出结果仍然为1 

  注意到,和sort一样,equal函数也支持传入一个回调函数,用于自定义“相等”的规则

#include <iostream>
#include <algorithm> 
using namespace std;

bool f(int i,char j){
    // 数字字符和整数,视为相等 
    return i==int(j)-48;
}
int main()
{
    int a[5] = {1,2,3,4,5}; 
    char b[5] = {'1','2','3','4','5'};
    // 调用自定义的比较规则 
    bool result = equal(a,a+5,b,f);
    cout<<result<<endl;
}
// 输出结果为1 

 

标签:std,头文件,cout,int,简介,C++,container,using,include
From: https://www.cnblogs.com/haruyuki/p/18391434

相关文章

  • CLR/C++程序找不到DLL最有效方法?
     使用C++17及以上,支持filesystem处理不需要程序集强签名,也不用注册全局程序集缓存,非常有效。#include<iostream>#include<filesystem>usingnamespacestd::filesystem;namespacefs=std::filesystem;//-----------------------------------------------------......
  • Modern C++——不准确“类型声明”引发的非必要性能损耗
    大纲案例代码地址C++是一种强类型语言。我们在编码时就需要明确指出每个变量的类型,进而让编译器可以正确的编译。看似C++编译器比其他弱类型语言的编译器要死板,实则它也做了很多“隐藏”的操作。它会在尝试针对一些非预期类型进行相应转换,以符合预期,比如《C++拾趣——......
  • c++ I/O
    1.flush刷新缓存,endl刷新缓存并换行cout<<"Hello"<<fulsh;cout<<"Wait<<endl;2.hex,oct,dec输出16进制,8进制,10进制cout<<hexcout<<octcout<<dec3.使用width调节宽度cout.width(12);//width函数只影响下一个要显示的item4.使用fill填充字符。C++默认......
  • C++ 标准输入输出 -- <iostream>
    <iostream>库是C++标准库中用于输入输出操作的头文件。<iostream>定义了几个常用的流类和操作符,允许程序与标准输入输出设备(如键盘和屏幕)进行交互。以下是<iostream>库的详细使用说明,包括其主要类和常见用法示例。主要类std::istream:用于输入操作的抽象基类。std::ostre......
  • C++奇迹之旅:深度解析list的模拟实现
    文章目录......
  • C++:std::thread 和 pthread
            在C++中,线程的实现主要有两种方式:使用C++11标准库中的std::thread和POSIX线程库(pthread)。这两种方式各有优缺点,适用于不同的场景。以下是对这两种方式的详细比较和示例代码。std::thread示例代码#include<iostream>#include<thread>#include<chrono>......
  • C++:std::this_thread::sleep_for 和 sleep
            在C++中,std::this_thread::sleep_for和sleep函数都可以用来使当前线程暂停执行一段时间,但它们有一些重要的区别。以下是对这两种方法的详细比较:std::this_thread::sleep_for定义:std::this_thread::sleep_for是C++11标准库中的一个函数,用于使当前线程暂停执......
  • C++面向对象编程(OOP)教程
    C++面向对象编程(OOP)教程在C++中,面向对象编程(OOP)是一种编程范式,它基于“对象”的概念来设计软件。OOP强调将数据(属性)和操作这些数据的方法(行为)封装在一起,形成对象。这种封装提高了代码的模块化、可重用性和可维护性。C++通过类(Class)、对象(Object)、继承(Inheritance)、封装(Encapsu......
  • C# 一分钟浅谈:变量与数据类型简介
    引言在C#编程中,了解和使用变量与数据类型是非常基础且重要的一步。正确的数据类型选择不仅能够提高程序的性能,还能避免许多潜在的问题。本文将详细介绍C#中常见的数据类型和变量的使用方法,并探讨一些常见的问题及其解决方法。常见数据类型C#中的数据类型主要分为两大类:值......
  • c++ STL常用容器使用(vector、deque、stack、queue、list、set、map等)
    1、vector使用动态数组,也叫可变数组,容器的空间是动态增长的,当空间不足时,申请更大一块空间,让后将原数据拷贝到新空间中,并释放原空间在这里插入图片描述1.1、初始化操作intarr[]={1,3,2,5};//1、方式一(初始化)vector<int>v1;//容器尾部插入数据v1.push_back(1);v1......