STL常用排序算法、替换算法、拷贝算法(20221207)

STL的常用算法

概述:

算法主要是由头文件 组成。

是所有STL头文件中最大的一个,涉及比较、交换、查找、遍历等等;

定义了一些模板类,用于声明函数对象;

体积很小,只包括几个在序列上面进行简单数学运算的模板函数。

三、排序算法

算法简介:
sort //对容器内元素进行排序

random_shuffle  //洗牌 指定范围内元素随机调整顺序

merge //容器元素合并 并存储到另一容器中

reverse  //反转指定范围内容器

1、random_shuffle(iterator beg,iterator end);

指定范围内的元素随机调整次序;算法实用,但使用时注意加随机数种子才能真正的随机打乱

void myPrint(int val)

{

    cout << val << " ";

}



void test01()

{

    //加入随机数种子,使每次打乱顺序随机

    srand((unsigned int)time(NULL));

    vectorV1;

    V1.push_back(10);

    V1.push_back(20);

    V1.push_back(30);

    V1.push_back(40);

    V1.push_back(50);

    //原顺序

    for_each(V1.begin(), V1.end(), myPrint);//函数打印 myPrint

    cout << endl;

   //利用洗牌算法打乱顺序

    random_shuffle(V1.begin(), V1.end());

    //遍历打印输出

    for_each(V1.begin(), V1.end(), myPrint);//函数打印 myPrint

    cout << endl;

}

STL常用排序算法、替换算法、拷贝算法(20221207)_第1张图片

2、merge

两个容器元素合并,并存储到另一容器中

注意两个容器必须是有序的

merge(iterator beg1,iterator end1, iterator beg2,iterator end2,iterator dest);

dest:目标容器迭代器的begin()

void myPrint(int val)

{

    cout << val << " ";

}



void test01()

{

    //加入随机数种子,使每次打乱顺序随机

    srand((unsigned int)time(NULL));

    vectorV1;

    V1.push_back(10);

    V1.push_back(20);

    V1.push_back(30);

    V1.push_back(40);

    V1.push_back(50);

    //原顺序

    for_each(V1.begin(), V1.end(), myPrint);//函数打印 myPrint

    cout << endl;

   //利用洗牌算法打乱顺序

    random_shuffle(V1.begin(), V1.end());

    //遍历打印输出

    for_each(V1.begin(), V1.end(), myPrint);//函数打印 myPrint

    cout << endl;

}

3、reverse(iterator beg,iterator end);

将指定范围内的元素反转

四、常用的拷贝和替换算法

copy

replace

replace_if

swap

1、copy(iterator beg,iterator end,iterator dest);

容器指定范围内的元素拷贝到另一容器中。

dest:目标起始迭代器

2、replace(iterator beg,iterator end,oldvalue,newvalue);

将容器内指定区间内旧元素替换成新元素  满足oldvalue的元素都被替换掉

void myPrint(int val)

{

    cout << val << " ";

}



class Print {

public:

    void operator()(int val)

    {

        cout << val << " ";

    }

};

void test04()

{

    vectorV1;

    V1.push_back(10);

    V1.push_back(20);

    V1.push_back(30);

    V1.push_back(40);

    V1.push_back(50);

    //遍历 替换前

    for_each(V1.begin(), V1.end(), myPrint);//函数打印 myPrint

    cout << endl;

    replace(V1.begin(),V1.end(),30,3000);//30替换成3000

    for_each(V1.begin(), V1.end(), Print());//仿函数打印 Print()为匿名对象

    cout << endl;

}

STL常用排序算法、替换算法、拷贝算法(20221207)_第2张图片

3、replace_if(iterator beg,iterator end,_pred,newvalue);

//按条件替换元素 满足条件的替换成指定元素

_pred为谓词

class Greater30 {

public:

    bool operator()(int val)

    {

        return val > 30;

    }



};



void test05()

{

    vectorV1;

    V1.push_back(10);

    V1.push_back(20);

    V1.push_back(30);

    V1.push_back(40);

    V1.push_back(50);

    //遍历 替换前

    for_each(V1.begin(), V1.end(), myPrint);//函数打印 myPrint

    cout << endl;

    replace_if(V1.begin(), V1.end(), Greater30(), 3000);//将大于30的元素替换成3000  Greater30()匿名对象

    for_each(V1.begin(), V1.end(), Print());//仿函数打印 Print()为匿名对象

    cout << endl;

}

STL常用排序算法、替换算法、拷贝算法(20221207)_第3张图片

replace_if按条件查找,可以利用仿函数灵活筛选满足的条件

4、swap

互换两个容器的元素

swap(container c1,container c2);

注意容器c1、c2需要满足相同结构类型

void test07()

{

    vectorV1;

    V1.push_back(10);

    V1.push_back(20);

    V1.push_back(30);

    V1.push_back(40);

    V1.push_back(50);

    vectorV2;

    V2.push_back(15);

    V2.push_back(24);

    V2.push_back(37);

    V2.push_back(48);

    V2.push_back(59);

    V2.push_back(69);

    V2.push_back(79);

    V2.push_back(89);

    //遍历 交换前

    for_each(V1.begin(), V1.end(), myPrint);//函数打印 myPrint

    cout << endl;

    swap(V1, V2);//交换

    for_each(V1.begin(), V1.end(), Print());//仿函数打印 Print()为匿名对象

    cout << endl;

}

你可能感兴趣的:(c++学习,算法,数据结构,c++)