STL库--算法

23 篇文章 0 订阅
本文详细介绍了C++标准库中的几种常见算法,包括遍历(如for_each)、查找(如find、find_if、adjacent_find)、排序(如sort、stable_sort)、部分排序(如partial_sort)以及集合操作(如set_intersection、set_union)。这些算法提高了代码效率,简化了编程任务。
摘要由CSDN通过智能技术生成

头文件#include<algorithm>

常用的遍历算法

for_each()

作用:遍历指定范围内的元素,并对每个元素调用传入的操作函数。

函数原型

        template <class InputIterator, class Function>

        Function for_each(InputIterator first, InputIterator last, Function fn);

参数

        InputIterator:是输入迭代器类型,用于指定要遍历的范围的起始和结束位置。

                first是指向范围起始位置的迭代器。

                last是指向范围结束位置的迭代器(不包含在范围内)。

        fn:是要执行的操作函数。操作函数可以是普通函数、函数对象或lambda表达式。该函数没有返回值,仅用于执行操作

例:

#include <iostream>

#include <vector>

#include <algorithm>



void print(int num) {

    std::cout << num << " ";

}



int main() {

    std::vector<int> nums = {1, 2, 3, 4, 5};



    std::for_each(nums.begin(), nums.end(), print);



    return 0;

}

//1 2 3 4 5

transform()

作用:将指定容器区间元素搬运到另一容器中

函数原型

        template <class InputIterator, class OutputIterator, class UnaryOperation>

        OutputIterator transform(InputIterator first1, InputIterator last1, OutputIterator result, UnaryOperation op);

参数:

        InputIterator是输入迭代器类型,用于指定要遍历的范围的起始和结束位置。

                first1是指向输入范围起始位置的迭代器。

                last1是指向输入范围结束位置的迭代器(不包含在范围内)。

        OutputIterator是输出迭代器类型,用于指定存储结果的范围的起始位置。

                result是指向输出范围起始位置的迭代器。

        op是要应用的操作函数,可以是函数指针、函数对象或lambda表达式。

注意:

        1.transform 不会给目标容器分配内存, 所以需要我们提前分配好内存

        2.容器类型要相同

例:

		#include <iostream>
		#include <vector>
		#include <algorithm>
		
		int doubleValue(int num) {
		    return num * 2;
		}
		
		int main() {
		    std::vector<int> nums = {1, 2, 3, 4, 5};
		    std::vector<int> doubledNums(nums.size());
		
		    std::transform(nums.begin(), nums.end(), doubledNums.begin(), doubleValue);
		
		    for (int num : doubledNums) {
		        std::cout << num << " ";
		    }
		
		    return 0;
		}
		//2 4 6 8 10

常用查找算法

find()

作用:查找区间[begin,end)中是否存在元素。若有,则返回该位置的迭代器,若没有,则返回end()

函数原型

        template <class InputIterator, class T>

        InputIterator find(InputIterator first, InputIterator last, const T& value);

参数

        InputIterator是输入迭代器类型,用于指定要遍历的范围的起始和结束位置。

                first是指向范围起始位置的迭代器。

                last是指向范围结束位置的迭代器(不包含在范围内)。

        T是要查找的值的类型。

                value是要查找的值。

例:对普通成员  

int main()
{
    vector<int> v1;
    v1.push_back(18);
	v1.push_back(28);
	v1.push_back(19);
	v1.push_back(38);
		
	vector<int>::iterator ret;
	ret=find(v1.begin(),v1.end(),28);
	if(ret != v1.end()) cout<<"找到的数据为:"<<*ret<<endl;
	else cout<<"未找到"<<endl;
	return 0;
}

  例:对自定义成员

class Person
{
public:
	string name;
	int age;
	Person(string name,int age){
		this->name=name;
		this->age=age;
	}
	bool operator==(const Person &ob){
		if(this->name==ob.name && this->age==ob.age)    return true;
		return false;
	}
};

int main()
{
	vector<Person> v2;
	v2.push_back(Person("德玛西亚",18));
	v2.push_back(Person("小法",19));
	v2.push_back(Person("小炮",20));
	v2.push_back(Person("牛头",21));

	Person tmp("小炮",20);
	vector<Person>::iterator ret;
	ret=find(v2.begin(),v2.end(),tmp);
	if(ret != v2.end()) cout<<"找到的数据为:"<<(*ret).name<<" "<<(*ret).age<<endl;
	else cout<<"未找到"<<endl;
	return 0;
}

find_if()

作用:在指定范围内查找满足指定条件的元素,并返回指向该元素的迭代器。

函数原型:

        template <class InputIterator, class UnaryPredicate>

        InputIterator find_if(InputIterator first, InputIterator last, UnaryPredicate pred);

参数:

        InputIterator是输入迭代器类型,用于指定要遍历的范围的起始和结束位置。

                first是指向范围起始位置的迭代器。

                last是指向范围结束位置的迭代器(不包含在范围内)。

        UnaryPredicate是一个一元谓词(接受一个参数并返回一个bool值的函数对象或函数指针),用于指定要满足的条件。

                pred是一个一元谓词,用于指定要满足的条件。

例:普通函数

bool myGreaterThan20(int val)

{

    return val>20;

}



int main()

{

    vector<int> v2;

    v2.push_back(10);

    v2.push_back(20);

    v2.push_back(30);

    v2.push_back(40);



    vector<int>::iterator ret;

    ret=find_if(v2.begin(),v2.end(),myGreaterThan20);

    if(ret != v2.end()) cout<<"找到的数据为:"<<*ret<<endl;

    else cout<<"未找到"<<endl;

    return 0;

}

例:仿函数

class MyGreaterThan20{

public:

    bool operator()(int val)

    {

        return val>20;

    }

};



int main()

{

    vector<int> v2;

    v2.push_back(10);

    v2.push_back(20);

    v2.push_back(30);

    v2.push_back(40);



    vector<int>::iterator ret;

    ret=find_if(v2.begin(),v2.end(),MyGreaterThan20());

    if(ret != v2.end()) cout<<"找到的数据为:"<<*ret<<endl;

    else cout<<"未找到"<<endl;

    return 0;

}

adjacent_find()

作用:在指定范围内查找相邻的重复元素,并返回指向第一个重复元素的迭代器。

函数原型:

        template <class ForwardIterator>

        ForwardIterator adjacent_find(ForwardIterator first, ForwardIterator last);

参数:

        ForwardIterator是前向迭代器类型,用于指定要遍历的范围的起始和结束位置。

                first是指向范围起始位置的迭代器。

                last是指向范围结束位置的迭代器(不包含在范围内)。

例1:普通数据

int main()

{

    vector<int> v1;

    v1.push_back(10);

    v1.push_back(20);

    v1.push_back(20);

    v1.push_back(40);

    v1.push_back(50);

    v1.push_back(50);



    vector<int>::iterator ret;

    ret=adjacent_find(v1.begin(),v1.end());

    if(ret!=v1.end())   cout<<"寻找到重复元素:"<<*ret<<endl;

    return 0;

}

例2:自定义数据(对==进行运算符重载)

class Person

{

public:

    string name;

    int age;

    Person(string name,int age){

        this->name=name;

        this->age=age;

    }

    bool operator==(const Person &ob){

        if(this->name==ob.name && this->age==ob.age)    return true;

        return false;

    }

};



int main()

{

    vector<Person> v2;

    v2.push_back(Person("德玛西亚",18));

    v2.push_back(Person("小法",19));

    v2.push_back(Person("小法",19));

    v2.push_back(Person("牛头",21));



    vector<Person>::iterator ret;

    ret=adjacent_find(v2.begin(),v2.end());

    if(ret != v2.end()) cout<<"找到的数据为:"<<(*ret).name<<" "<<(*ret).age<<endl;

    else cout<<"未找到"<<endl;

    return 0;

}

binary_search 

作用:在已排序的范围内,通过二分查找法查找指定的元素,并返回一个bool值表示是否找到。

函数原型:

        template <class ForwardIterator, class T>

        bool binary_search(ForwardIterator first, ForwardIterator last, const T& value);

参数

        ForwardIterator是前向迭代器类型,用于指定要遍历的范围的起始和结束位置。

                first是指向范围起始位置的迭代器。

                last是指向范围结束位置的迭代器(不包含在范围内)。

        T是要查找的元素的类型。

                value是要查找的元素。

注意:容器必须有序

例:

int main()

{

    vector<int> v1;

    v1.push_back(10);

    v1.push_back(20);

    v1.push_back(30);

    v1.push_back(40);

    v1.push_back(50);



    bool ret=binary_search(v1.begin(),v1.end(),30);

    if(ret==true)   cout<<"找到"<<endl;

    else    cout<<"未找到"<<endl;

    return 0;

}

count

作用:遍历输入范围内的元素,统计等于给定值的元素的个数,并返回结果。

函数原型:

        template <class InputIterator, class T>

        typename iterator_traits<InputIterator>::difference_type count(InputIterator first,                 InputIterator last, const T& value);

参数:        

        InputIterator是输入迭代器类型,用于指定要遍历的范围的起始和结束位置。

                first是指向范围起始位置的迭代器。

                last是指向范围结束位置的迭代器。

        T是要计数的元素的类型。

                value是要计数的元素。

int main()

{

    vector<int> v1;

    v1.push_back(10);

    v1.push_back(20);

    v1.push_back(30);

    v1.push_back(40);

    v1.push_back(50);



    cout<<count(v1.begin(),v1.end(),10)<<endl;

    return 0;

}

count_if

作用:遍历输入范围内的元素,统计满足指定条件的元素的个数,并返回结果。

函数原型:

        template <class InputIterator, class UnaryPredicate>

        typename iterator_traits<InputIterator>::difference_type count_if(InputIterator first,

                InputIterator last, UnaryPredicate pred);

参数              

        InputIterator是输入迭代器类型,用于指定要遍历的范围的起始和结束位置。

                first是指向范围起始位置的迭代器。

                last是指向范围结束位置的迭代器。

        UnaryPredicate是一个一元谓词(即接受一个参数并返回一个bool值的函数对象或函数指针),用于指定判断条件。

                pred是用于判断元素是否满足条件的谓词函数。

例:统计大于10的元素出现的次数

bool myGreaterThan10(int val)

{

    return val>10;

}



class MyGreaterThan10

{

public:

    bool operator()(int val){

        return val>10;

    }

};



int main()

{

    vector<int> v1;

    v1.push_back(10);

    v1.push_back(20);

    v1.push_back(30);

    v1.push_back(40);

    v1.push_back(50);



    //普通函数

    cout<<count_if(v1.begin(),v1.end(),myGreaterThan10)<<endl;

    //函数对象

    cout<<count_if(v1.begin(),v1.end(),MyGreaterThan10())<<endl;

    //内建函数对象

    cout<<count_if(v1.begin(),v1.end(),bind2nd(greater<int>(),10))<<endl;

    return 0;

}

max_element

作用:遍历输入范围内的元素,找到最大的元素,并返回指向该元素的迭代器。

函数原型:

        template <class ForwardIterator>

        ForwardIterator max_element(ForwardIterator first, ForwardIterator last);

参数

        ForwardIterator是前向迭代器类型,用于指定要遍历的范围的起始和结束位置。

                first是指向范围起始位置的迭代器。

                last是指向范围结束位置的迭代器。

例:

#include <iostream>

#include <vector>

#include <algorithm>



int main() {

    std::vector<int> nums = {1, 4, 2, 5, 3};



    auto maxIt = std::max_element(nums.begin(), nums.end());



    std::cout << "Max element: " << *maxIt << std::endl;



    return 0;

}

min_element

作用:遍历输入范围内的元素,找到最小的元素,并返回指向该元素的迭代器。

函数原型:

        template <class ForwardIterator>

        ForwardIterator min_element(ForwardIterator first, ForwardIterator last);

参数:

        ForwardIterator是前向迭代器类型,用于指定要遍历的范围的起始和结束位置。

                first是指向范围起始位置的迭代器。

                last是指向范围结束位置的迭代器。

例:

#include <iostream>

#include <vector>

#include <algorithm>



int main() {

    std::vector<int> nums = {3, 1, 4, 2, 5};



    auto minIt = std::min_element(nums.begin(), nums.end());



    std::cout << "Min element: " << *minIt << std::endl;



    return 0;

}

minmax_element

作用:在给定范围内查找最小值和最大值的迭代器。

函数原型:

        template <class ForwardIt>

        std::pair<ForwardIt, ForwardIt> minmax_element(ForwardIt first, ForwardIt last);

参数

        ForwardIterator是前向迭代器类型,用于指定要遍历的范围的起始和结束位置。

                first是指向范围起始位置的迭代器。

                last是指向范围结束位置的迭代器。

例:

#include <iostream>

#include <vector>

#include <algorithm>



int main() {

    std::vector<int> values = {5, 3, 9, 2, 7};



    auto minmaxIt = std::minmax_element(values.begin(), values.end());



    std::cout << "Min value: " << *minmaxIt.first << std::endl;

    std::cout << "Max value: " << *minmaxIt.second << std::endl;



    return 0;

}

nth_element

作用:对给定范围内的元素进行部分排序。使得nth之前的元素都小于等于它nth之后的元素都大于等于它,而n小的值恰好在nth位置上。

函数原型:

        template <class RandomIt>

        void nth_element(RandomIt first, RandomIt nth, RandomIt last);

参数

        RandomIt是迭代器类型,用于指定要排序的范围。

                first是指向范围起始位置的迭代器。

                last是指向范围结束位置的迭代器。

        nth是迭代器,表示要将第n个元素放置的位置。

#include <iostream>

#include <vector>

#include <algorithm>



int main() {

    std::vector<int> values = {5, 3, 9, 2, 7};



    std::nth_element(values.begin(), values.begin() + 2, values.end());



    std::cout << "Third element: " << values[2] << std::endl;



    return 0;

}

常用排序算法

is_sorted

作用:检查给定范围内的元素是否按升序排序。

函数原型:

        template <class ForwardIt>

        bool is_sorted(ForwardIt first, ForwardIt last);

参数:

        ForwardIterator是前向迭代器类型,用于指定要遍历的范围的起始和结束位置。

                first是指向范围起始位置的迭代器。

                last是指向范围结束位置的迭代器。

例:

#include <iostream>

#include <vector>

#include <algorithm>



int main() {

    std::vector<int> values = {1, 2, 3, 4, 5};



    bool sorted = std::is_sorted(values.begin(), values.end());



    if (sorted) {

        std::cout << "The range is sorted." << std::endl;

    } else {

        std::cout << "The range is not sorted." << std::endl;

    }



    return 0;

}

merge

作用:将两个已排序的容器元素合并, 并存储到另一容器中

注意:每个容器必须有序,不是单纯的追加

函数原型:

        template <class InputIt1, class InputIt2, class OutputIt>

        OutputIt merge(InputIt1 first1, InputIt1 last1, InputIt2 first2, InputIt2 last2, OutputIt d_first);

                InputIt1和InputIt2是迭代器类型,用于指定要合并的两个已排序范围。

                OutputIt是迭代器类型,用于指定合并后的范围的目标位置。

                        first1和last1是迭代器,表示第一个已排序范围的起始和结束位置。

                        first2和last2是迭代器,表示第二个已排序范围的起始和结束位置。

                d_first是迭代器,表示合并后的范围的起始位置。

例:

int main()

{

    vector<int> v1;

    v1.push_back(10);

    v1.push_back(20);

    v1.push_back(30);

    v1.push_back(40);

    v1.push_back(50);



    vector<int> v2;

    v2.push_back(8);

    v2.push_back(9);

    v2.push_back(12);

    v2.push_back(22);

    v2.push_back(58);





    vector<int> v3;

    v3.resize(v1.size()+v2.size());

    merge(v1.begin(),v1.end(),v2.begin(),v2.end(),v3.begin());



    for_each(v3.begin(),v3.end(),[](int val){

        cout<<val<<" ";

    });

    return 0;

}

sort

作用:容器元素排序。

注意:默认使用比较函数来对元素进行排序,如果需要自定义排序的方式,可以将谓词做完第三个参数

函数原型:

        template<class RandomIt>

        void sort(RandomIt first, RandomIt last);

        template<class RandomIt, class Compare>

        void sort(RandomIt first, RandomIt last, Compare comp);

参数:

        RandomIt是一个迭代器类型,用于指向排序范围中的元素。

                first和last参数分别指定了排序范围的起始位置和结束位置。

例:

//对a数组的[1,n]位置进行从小到大排序

sort(a + 1, a + 1 + n);



//对a数组的[0,n-1]位置从大到小排序

sort(a, a + n, greater<int>());

//对a数组的[0,n-1]位置从小到大排序

sort(a, a + n, less<int>());



//自定义排序,定义比较函数

bool cmp1(node x,node y){

    return x.s>y.s;   //定义降序排序(从大到小)

}

bool cmp2(node x,node y){

    return x.k<y.k;   //定义升序排序(从小到大)

}

partial_sort

作用:部分排序,将[beg,mid)之间的元素排序,剩余的元素则不保证有序。

注意:默认使用比较函数来对元素进行排序,如果需要自定义排序的方式,可以将谓词做完第三个参数

函数原型:

        template<class RandomIt>

        void partial_sort(RandomIt first, RandomIt middle, RandomIt last);

        template<class RandomIt, class Compare>

        void partial_sort(RandomIt first, RandomIt middle, RandomIt last, Compare comp);

参数

        RandomIt是一个迭代器类型,用于指向排序范围中的元素。

                first和last参数分别指定了排序范围的起始位置和结束位置。

        middle参数指定了部分排序后的中间位置。

例:

int a[] = {1,2,5,4,7,9,8,10,6,3};

partial_sort(a, a + 5, a + 10);

for(int i = 0; i < 10; i++)

    cout << a[i] << ' ';

//1 2 3 4 5 9 8 10 7 6

//前五个元素都有序



也可以添加自定义排序规则:partial_sort(beg,mid,end,cmp)

int a[] = {1,2,5,4,7,9,8,10,6,3};

partial_sort(a, a + 5, a + 10, greater<int>());

for(int i = 0; i < 10; i++)

    cout << a[i] << ' ';

//10 9 8 7 6 1 2 4 5 3

//前五个元素降序有序

stable_sort

作用:和sort功能一样,特别之处在于stable_sort()能够保证相同元素的相对位置不变(稳定性)。

函数原型:

        template<class RandomIt>

        void stable_sort(RandomIt first, RandomIt last);

        template<class RandomIt, class Compare>

        void stable_sort(RandomIt first, RandomIt last, Compare comp);

参数:

        RandomIt是一个迭代器类型,用于指向排序范围中的元素。

                first和last参数分别指定了排序范围的起始位置和结束位置。

例:

#include <iostream>

#include <vector>

#include <algorithm>



int main() {

    std::vector<int> numbers = {5, 2, 8, 3, 1, 9, 4};



    std::stable_sort(numbers.begin(), numbers.end());



    std::cout << "Sorted vector: ";

    for (const auto& num : numbers) {

        std::cout << num << " ";

    }

    std::cout << std::endl;



    return 0;

}

shuffle

作用:对指定范围内的元素随机调整次序

注意:C++11之后应尽量使用shuffle来代替random_shuffle。

        原因:random_shuffle() 函数在重排元素时使用的是默认的随机数生成器,而这个生成器的随机性不够强,容易导致重排结果不够随机。而shuffle() 函数接受一个随机数生成器作为参数,可以使用更强大的随机数生成器来实现随机重排。

函数原型:

        template<class RandomIt>

        void shuffle(RandomIt first, RandomIt last);

        template<class RandomIt, class RandomFunc>

        void shuffle(RandomIt first, RandomIt last, RandomFunc&& rand);

参数:

        RandomIt是一个迭代器类型,用于指向重排范围中的元素。

                first和last参数分别指定了重排范围的起始位置和结束位置。

        rand参数可以指定一个随机数生成函数,该函数应该接受一个整数参数,并返回一个表示随机数的整数值。

例:

#include <iostream>

#include <algorithm>

#include <cstdlib>

#include <ctime>

#include <vector>



int main() {

    std::vector<int> numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};



    // 使用 srand() 函数设置随机数种子

    std::srand(std::time(0));



    // 使用默认的随机数生成器进行随机重排

    std::shuffle(numbers.begin(), numbers.end(), std::default_random_engine(std::rand()));



    // 输出重排后的数组

    for (const auto& number : numbers) {

        std::cout << number << " ";

    }

    std::cout << std::endl;



    return 0;

}

//为了使用 srand() 作为随机数生成器,我们将 std::rand() 的结果传递给 std::default_random_engine 类,以创建一个默认的随机数生成器

reverse

作用:翻转指定区间内的元素。

函数原型:

        template <class BidirectionalIterator>

        void reverse(BidirectionalIterator first, BidirectionalIterator last);

参数:

        BidirectionalIterator 是一个满足双向迭代器要求的类型

        双向迭代器要求:

                可以使用 ++ 运算符在正向方向上移动迭代器,即可以将迭代器向前移动到容器中的下一个元素。

                可以使用 -- 运算符在反向方向上移动迭代器,即可以将迭代器向后移动到容器中的上一个元素。

                支持解引用操作符 *,可以访问迭代器当前位置的元素。

                支持成员函数 !=,用于比较两个迭代器是否指向不同的元素。

                支持成员函数 ==,用于比较两个迭代器是否指向相同的元素。

        first和last参数分别指定了翻转范围的起始位置和结束位置。

案例

#include <iostream>

#include <algorithm>

#include <vector>



int main() {

    std::vector<int> numbers = {1, 2, 3, 4, 5};



    // 反转数组的元素

    std::reverse(numbers.begin(), numbers.end());



    // 输出反转后的数组

    for (const auto& number : numbers) {

        std::cout << number << " ";

    }

    std::cout << std::endl;



    return 0;

}

常用拷贝和替换算法

copy

作用:将范围 [first, last) 中的元素复制到以 result 作为起始位置的目标范围中,并返回复制结束的位置的迭代器。

函数原型:

        template <class InputIterator, class OutputIterator>

        OutputIterator copy(InputIterator first, InputIterator last, OutputIterator result);

参数:

        first:指向要复制的范围的起始位置的迭代器。

        last:指向要复制的范围的结束位置的迭代器(不包含在范围内)。

        result:指向复制的目标位置的迭代器。

案例

#include <iostream>

#include <vector>

#include <algorithm>



int main() {

    std::vector<int> source = {1, 2, 3, 4, 5};

    std::vector<int> destination(5); // 目标容器,大小为5



    std::copy(source.begin(), source.end(), destination.begin());



    // 输出目标容器中的元素

    for (const auto& num : destination) {

        std::cout << num << " ";

    }

    std::cout << std::endl;



    return 0;

}

replace

作用:将范围 [first, last) 中所有等于 old_value 的元素替换为 new_value。

函数原型:

        template<class ForwardIterator, class T>

        void replace (ForwardIterator first, ForwardIterator last, const T& old_value, const T& new_value);

参数:

        first:指向要替换的范围的起始位置的迭代器。

        last:指向要替换的范围的结束位置的迭代器(不包含在范围内)。

        old_value:要替换的旧值。

        new_value:要替换为的新值。

例:

#include <iostream>

#include <vector>

#include <algorithm>



int main() {

    std::vector<int> numbers = {1, 2, 3, 2, 4, 2, 5};



    std::replace(numbers.begin(), numbers.end(), 2, 6);



    // 输出替换后的元素

    for (const auto& num : numbers) {

        std::cout << num << " ";

    }

    std::cout << std::endl;



    return 0;

}

//1 6 3 6 4 6 5

replace_if

作用:将范围 [first, last) 中所有满足 pred 条件的元素替换为 new_value

函数原型:

        template<class ForwardIterator, class UnaryPredicate, class T>

        void replace_if (ForwardIterator first, ForwardIterator last, UnaryPredicate pred, const T& new_value);

参数:

        first:指向要替换的范围的起始位置的迭代器。

        last:指向要替换的范围的结束位置的迭代器(不包含在范围内)。

        pred:一元谓词函数或函数对象,用于判断元素是否满足替换条件。

        new_value:要替换为的新值。

案例

int main()

{

    vector<int> v1;

    v1.push_back(10);

    v1.push_back(20);

    v1.push_back(30);

    v1.push_back(40);

    v1.push_back(50);



    replace_if(v1.begin(),v1.end(),bind2nd(greater<int>(),30),300);



    for_each(v1.begin(),v1.end(),[](int val){

        cout<<val<<" ";

    });

    cout<<endl;



    //用copy输出

    copy(v1.begin(),v1.end(),ostream_iterator<int>(cout," "));

    return 0;

}

swap

作用:交换两个对象的值

函数原型:

        template<class T>

        void swap (T& a, T& b);

例:

#include <iostream>

#include <vector>

#include <algorithm>



int main() {

    int a = 5;

    int b = 10;



    std::swap(a, b);



    std::cout << "a: " << a << std::endl;

    std::cout << "b: " << b << std::endl;



    return 0;

}

unique

作用:移除连续重复的元素,只保留每个重复元素的第一个副本。返回一个指向不重复元素的末尾位置的迭代器。

函数原型:

        template<class ForwardIt>

        ForwardIt unique(ForwardIt first, ForwardIt last);

参数:

        first:指向要操作的范围的起始位置的迭代器。

        last:指向要操作的范围的结束位置的迭代器。

例如:a[] = {1, 3, 2, 3, 6};

        unique之后a数组为{1, 2, 3, 6, 3}前面为无重复元素的数组,后面则是重复元素移到后面,返回a[4]位置的地址(不重复元素的尾后地址)

注意:消除重复元素一般需要原序列是有序序列

例:

#include <iostream>

#include <vector>

#include <algorithm>



int main() {

    std::vector<int> nums = {1, 1, 2, 2, 3, 4, 4, 5, 5, 5};



    auto last = std::unique(nums.begin(), nums.end());



    for (auto it = nums.begin(); it != last; ++it) {

        std::cout << *it << " ";

    }

    std::cout << std::endl;



    return 0;

}

//1 2 3 4 5

常用算数生成算法

accumulate

作用:计算范围内元素的累加和(或其他二元操作的累积结果)

函数原型:

        template<class InputIt, class T>

        T accumulate(InputIt first, InputIt last, T init);

        template<class InputIt, class T, class BinaryOp>

        T accumulate(InputIt first, InputIt last, T init, BinaryOp op);

参数:

        first:指向要操作的范围的起始位置的迭代器。

        last:指向要操作的范围的结束位置的迭代器。

        init:起始值,用于指定累加的初始值。

        op:二元操作函数,用于指定累积操作。

案例1:对普通成员

int main(int argc, char** argv) {

int a[]={1,3,5,9,10};



//对[0,2]区间求和,初始值为0,结果为0+1+3+5=9

int res1 = accumulate(a, a + 3, 0);

cout<<"累加的和为:"<<res1;



//对[0,3]区间求和,初始值为5,结果为5+1+3+5+9=23

int res2 = accumulate(a, a + 4, 5);

cout<<"累加的和为:"<<res2;



}

案例2:对自定义成员

#include <iostream>

#include <vector>

#include <numeric>



int multiply(int x, int y) {

    return x * y;

}



int main() {

    std::vector<int> nums = {1, 2, 3, 4, 5};



    int product = std::accumulate(nums.begin(), nums.end(), 1, multiply);



    std::cout << "Product: " << product << std::endl;



    return 0;

}

fill

作用:将范围内的所有元素都设置为给定的值。

函数原型:

        template<class ForwardIt, class T>

        void fill(ForwardIt first, ForwardIt last, const T& value);

参数:

        first:指向要填充的范围的起始位置的迭代器。

        last:指向要填充的范围的结束位置的迭代器。

        value:要填充的值。

注意:和memset区别

        void* memset(void* ptr, int value, size_t num);

        1.语法和类型安全:fill是C++标准库中的函数,接受迭代器作为参数,可以用于容器和其他可迭代对象。它是类型安全的,可以根据迭代器的类型自动确定要填充的值的类型。而memset是C标准库中的函数,接受指针和字节数作为参数,只能用于原始的内存块,并且需要手动转换为适当的类型。

        2.支持的数据类型:fill可以用于任何支持赋值操作的类型,包括内置类型和用户自定义类型。而memset只能用于字节级别的操作,对于非字符类型的数据,需要手动进行类型转换

        3.填充值的限制:fill可以接受任何类型的值作为填充值,包括复杂的数据结构。而memset只能使用一个字节的值进行填充,通常是0或-1

        4.适用范围:fill可以用于任何STL容器(如vector、list、array等)以及普通的数组,可以指定要填充的范围。而memset只能用于连续的内存块,无法指定范围。

int main()

{

    vector<int> v1;

    v1.resize(5);

    fill(v1.begin(),v1.end(),100);



    copy(v1.begin(),v1.end(),ostream_iterator<int>(cout," "));

    return 0;

}

常用集合算法

set_intersection

作用:计算两个有序集合的交集,并将结果存储在另一个集合中。

函数原型:

        template <class InputIterator1, class InputIterator2, class OutputIterator>

        OutputIterator set_intersection(InputIterator1 first1, InputIterator1 last1,

                                InputIterator2 first2, InputIterator2 last2,

                                OutputIterator result);

#include <iostream>

#include <algorithm>

#include <vector>

int main() {

    std::vector<int> set1 = {1, 2, 3, 4, 5};

    std::vector<int> set2 = {3, 4, 5, 6, 7};

    std::vector<int> intersection;



    std::set_intersection(set1.begin(), set1.end(),

                          set2.begin(), set2.end(),

                          std::back_inserter(intersection));



    for (int num : intersection) {

        std::cout << num << " ";

    }



    return 0;

}

//3 4 5

set_union

作用:计算两个有序集合的并集,并将结果存储在另一个集合中。

函数原型:

        template <class InputIterator1, class InputIterator2, class OutputIterator>

        OutputIterator set_union(InputIterator1 first1, InputIterator1 last1,

                         InputIterator2 first2, InputIterator2 last2,

                         OutputIterator result);

例:

#include <iostream>

#include <algorithm>

#include <vector>



int main() {

    std::vector<int> set1 = {1, 2, 3, 4, 5};

    std::vector<int> set2 = {3, 4, 5, 6, 7};

    std::vector<int> unionSet;



    std::set_union(set1.begin(), set1.end(),

                   set2.begin(), set2.end(),

                   std::back_inserter(unionSet));



    for (int num : unionSet) {

        std::cout << num << " ";

    }



    return 0;

}

// 1 2 3 4 5 6 7

set_difference

作用:计算两个有序集合的差集,并将结果存储在另一个集合中(容器1中有的,容器2中没有的

函数原型:

        template <class InputIterator1, class InputIterator2, class OutputIterator>

        OutputIterator set_difference(InputIterator1 first1, InputIterator1 last1,

                              InputIterator2 first2, InputIterator2 last2,

                              OutputIterator result);

#include <iostream>

#include <algorithm>

#include <vector>



int main() {

    std::vector<int> set1 = {1, 2, 3, 4, 5};

    std::vector<int> set2 = {3, 4, 5, 6, 7};

    std::vector<int> diffSet;



    std::set_difference(set1.begin(), set1.end(),

                        set2.begin(), set2.end(),

                        std::back_inserter(diffSet));



    std::cout << "Difference: ";

    for (int num : diffSet) {

        std::cout << num << " ";

    }



    return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值