5 STL-常用算法

概述:
        ●算法主要是由头文件<algorithm> I <functional>| <numeric>组成。
        ●<algorithm> 是所有STL头文件中最大的一 个,范围涉及到比较、 交换、查找、遍历操作、 复制、修改等等
        ●<numeric> 体积很小,只包括几个在序列 上面进行简单数学运算的模板函数
        ●<functional> 定义了一些模板类,用以声明函数对象。
5.1常用遍历算法
学习目标:
        ●掌握常用的遍历算法
算法简介:
        ●for_ each        //遍历容器
        ●transform         //搬运容器到另一个容器中
5.1.1 for_ each

功能描述:
●实现遍历容器
函数原型:
        ●for_ each(iterator beg, iterator end,_ func);        //遍历算法遍历容器元素
                // beg开始迭代器
                // end结束迭代器
                // _func函数或者函数对象
示例:

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

// 常用遍历算法 for_each

// 普通函数
void print01(int val)
{
    cout << val << " ";
}
// 仿函数
class print02
{
public:
    void operator()(int val)
    {
        cout << val << " ";
    }
};
void test01()
{
    vector<int> v;
    for (int i = 0; i < 10; i++)
    {
        v.push_back(i);
    }
    for_each(v.begin(), v.end(), print01);
    cout << endl;

    for_each(v.begin(), v.end(), print02());
    cout << endl;
}

int main()
{
    test01();
    system("pause");
    return 0;
}

总结: for_ each在实际开发中是最常用遍历算法,需要熟练掌握

5.1.2 transform
功能描述:
●搬运容器到另一个容器中
函数原型:
        ●transform(iterator beg1, iterator end1, iterator beg2,_ _func);
                //beg1源容器开始迭代器
                //end1源容器结束迭代器
                //beg2目标容器开始迭代器
                //_func函数或者函数对象
示例:

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

// 常用遍历算法 transform

// 仿函数
class Transform
{
public:
    int operator()(int v)
    {
        return v + 100;
    }
};
class MyPrint
{
public:
    int operator()(int v)
    {
        cout << v << " ";
    }
};
void test01()
{
    vector<int> v;
    for (int i = 0; i < 10; i++)
    {
        v.push_back(i);
    }

    vector<int> vTarget;      // 目标容器
    vTarget.resize(v.size()); // 目标容器  需要提前开辟空间

    transform(v.begin(), v.end(), vTarget.begin(), Transform());
    for_each(vTarget.begin(), vTarget.end(), MyPrint());
    cout << endl;
};

int main()
{
    test01();
    system("pause");
    return 0;
}

5.2常用查找算法
学习目标:
●掌握常用的查找算法
算法简介:
        ●find        //查找元素
        ●find_ if        //按条件查找元素
        ●adjacent_ find         //查找相邻重复元素
        ●binary_ search         //二分查找法
        ●count        //统计元素个数
        ●count_if        //按条件统计元素个数
5.2.1 find
功能描述:
●查找指定元素,找到返回指定元素的迭代器,找不到返回结束迭代器end()
函数原型:

函数原型:
        ●find(iterator beg, iterator end, value);
                //按值查找元素,找到返回指定位置迭代器,找不到返回结束迭代器位置
                // beg开始迭代器
                // end结束迭代器
                // value查找的元素

#include <iostream>
using namespace std;
#include <vector>
#include <algorithm>
#include <string>
// 常用查找算法 find

// 查找 内置数据类型
void test01()
{
    vector<int> v;
    for (int i = 0; i < 10; i++)
    {
        v.push_back(i);
    }

    // 查找 容器中 是否有5这个元素
    vector<int>::iterator it = find(v.begin(), v.end(), 5);
    if (it == v.end())
    {
        cout << "没有找到!" << endl;
    }
    else
    {
        cout << "找到:" << *it << endl;
    }
}
class Person
{
public:
    Person(string name, int age)
    {
        this->m_Name = name;
        this->m_Age = age;
    }
    // 重载== 底层find知道如何对比person数据类型
    bool operator==(const Person &p)
    {
        if (this->m_Name == p.m_Name && this->m_Age == p.m_Age)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    string m_Name;
    int m_Age;
};
// 查找 自定义的数据类型
void test02()
{
    vector<Person> v;
    // 创建数据
    Person p1("aaa", 10);
    Person p2("bbb", 20);
    Person p3("ccc", 30);
    Person p4("ddd", 40);
    Person p5("eee", 50);

    // 放入容器中
    v.push_back(p1);
    v.push_back(p2);
    v.push_back(p3);
    v.push_back(p4);
    v.push_back(p5);

    Person pp("bbb", 20);

    vector<Person>::iterator it = find(v.begin(), v.end(), pp);
    if (it == v.end())
    {
        cout << "没有找到" << endl;
    }
    else
    {
        cout << "找到元素  姓名:" << it->m_Name << ",年龄:" << it->m_Age << endl;
    }
}

int main()
{
    // test01();
    test02();
    system("pause");
    return 0;
}

总结:利用find可以在容器中找指定的元素, 返回值是迭代器
5.2.2 find_ if
功能描述:
●按条件查找元素
函数原型:
        ●find_ if(iterator beg, iterator end,_ Pred);
                //按值查找元素,找到返回指定位置迭代器,找不到返回结束迭代器位置
                // beg开始迭代器
                // end结束迭代器
                //_pred 函数或者谓词(返回bool类型的仿函数)
示例:

#include <iostream>
using namespace std;
#include <vector>
#include <algorithm>
#include <string>
// 常用查找算法 find_if

// 查找 内置数据类型
class GreaterFive
{
public:
    bool operator()(int val)
    {
        return val > 5;
    }
};
void test01()
{
    vector<int> v;
    for (int i = 0; i < 10; i++)
    {
        v.push_back(i);
    }
    vector<int>::iterator it = find_if(v.begin(), v.end(), GreaterFive());
    // 查找 容器中 是否有大于5这个元素
    if (it == v.end())
    {
        cout << "没有找到!" << endl;
    }
    else
    {
        cout << "找到大于5的数字:" << *it << endl;
    }
}
class Person
{
public:
    Person(string name, int age)
    {
        this->m_Name = name;
        this->m_Age = age;
    }
    // 重载== 底层find知道如何对比person数据类型
    bool operator==(const Person &p)
    {
        if (this->m_Name == p.m_Name && this->m_Age == p.m_Age)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    string m_Name;
    int m_Age;
};
class Greater20
{
public:
    bool operator()(Person &p)
    {
        return p.m_Age > 20;
    }
};
// 查找 自定义的数据类型
void test02()
{
    vector<Person> v;
    // 创建数据
    Person p1("aaa", 10);
    Person p2("bbb", 20);
    Person p3("ccc", 30);
    Person p4("ddd", 40);
    Person p5("eee", 50);

    // 放入容器中
    v.push_back(p1);
    v.push_back(p2);
    v.push_back(p3);
    v.push_back(p4);
    v.push_back(p5);

    // 找年龄大于20的人
    vector<Person>::iterator it = find_if(v.begin(), v.end(), Greater20());

    if (it == v.end())
    {
        cout << "没有找到" << endl;
    }
    else
    {
        cout << "找到元素  姓名:" << it->m_Name << ",年龄:" << it->m_Age << endl;
    }
}

int main()
{
    // test01();
    test02();
    system("pause");
    return 0;
}

5.2.3 adjacent_ find|
功能描述:
        ●查找相邻重复元素
函数原型:
        ●adjacent_ find(iterator beg, iterator end);
                //查找相邻重复元素,返回相邻元素的第一个位 置的迭代器
                // beg开始迭代器
                // end结束迭代器
示例:

#include <iostream>
using namespace std;
#include <vector>
#include <algorithm>
#include <string>
// 常用查找算法 adjacent_find
void test01()
{
    vector<int> v;
    v.push_back(0);
    v.push_back(2);
    v.push_back(3);
    v.push_back(0);
    v.push_back(5);
    v.push_back(2);
    v.push_back(2);
    v.push_back(6);
    v.push_back(2);

    vector<int>::iterator pos = adjacent_find(v.begin(), v.end());

    if (pos == v.end())
    {
        cout << "未找到相邻重复元素" << endl;
    }
    else
    {
        cout << "找到相邻重复元素:" << *pos << endl;
    }
}

int main()
{
    test01();
    system("pause");
    return 0;
}

总结:面试题中如果出现查我相邻重复元素,记得用STL中的adjacent_find算法
5.2.4 binary_ search
功能描述:
●查找指定元素是否存在
函数原型:
        ●bool binary_ search(iterator beg, iterator end, value);
                //查找指定的元素,查到返回true否则false
                //注意:在无序序列中不可用
                // beg开始迭代器
                // end结束迭代器
                // value查找的元素
示例:

#include <iostream>
using namespace std;
#include <vector>
#include <algorithm>
#include <string>
// 常用查找算法 binary_search
void test01()
{
    vector<int> v;
    for (int i = 0; i < 10; i++)
    {
        v.push_back(i);
    }
    // v.push_back(2); 如果是无序序列,结果未知!
    //  查找容器中是否有9元素
    //  注意:容器必须是有序的序列
    bool ret = binary_search(v.begin(), v.end(), 9);

    if (ret)
    {
        cout << "找到了元素" << endl;
    }
    else
    {
        cout << "未找到" << endl;
    }
}

int main()
{
    test01();
    system("pause");
    return 0;
}

总结:二分查找法查找效率很高,值得注意的是查找的容器中元素必须的有序序列
5.2.5 count
功能描述:
        ●统计元素个数
函数原型:
        ●count(iterator beg, iterator end, value);
                //统计元素出现次数
                // beg开始迭代器
                // end结束迭代器
                // value统计的元素
示例:

#include <iostream>
using namespace std;
#include <vector>
#include <algorithm>
#include <string>
// 常用查找算法 count

// 1、 统计内置数据类型
void test01()
{
    vector<int> v;
    v.push_back(10);
    v.push_back(20);
    v.push_back(40);
    v.push_back(30);
    v.push_back(40);
    v.push_back(30);

    int num = count(v.begin(), v.end(), 40);
    cout << "40的元素个数为:" << num << endl;
};

// 2、 统计自定义数据类型
class Person
{
public:
    Person(string name, int age)
    {
        this->m_Name = name;
        this->m_Age = age;
    }
    bool operator==(const Person &p)
    {
        if (this->m_Age == p.m_Age)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    string m_Name;
    int m_Age;
};
void test02()
{
    vector<Person> v;
    Person p1("刘备", 35);
    Person p2("关羽", 45);
    Person p3("张飞", 56);
    Person p4("赵云", 33);

    // 将人员插入到容器中
    v.push_back(p1);
    v.push_back(p2);
    v.push_back(p3);
    v.push_back(p4);

    Person p("诸葛亮", 33);

    int num = count(v.begin(), v.end(), p);
    cout << "和诸葛亮同岁数的人员个数为:" << num << endl;
}

int main()
{
    // test01();
    test02();
    system("pause");
    return 0;
}

总结:统计自定义数据类型时候, 需要配合重载operator==
5.2.6 count_ if
功能描述:
●按条件统计元素个数
函数原型:
        ●count_ if(iterator beg, iterator end,_ Pred);
                //按条件统计元素出现次数
                // beg开始迭代器
                // end结束迭代器
                //_pred谓词
示例:

#include <iostream>
using namespace std;
#include <vector>
#include <algorithm>
#include <string>
// 常用查找算法 count_if

// 1、 统计内置数据类型
class Greator20
{
public:
    bool operator()(int val)
    {
        return val > 20;
    }
};
void test01()
{
    vector<int> v;
    v.push_back(10);
    v.push_back(20);
    v.push_back(40);
    v.push_back(30);
    v.push_back(40);
    v.push_back(30);

    int num = count_if(v.begin(), v.end(), Greator20());
    cout << "大于20的元素个数为:" << num << endl;
};

// 2、 统计自定义数据类型
class Person
{
public:
    Person(string name, int age)
    {
        this->m_Name = name;
        this->m_Age = age;
    }
    bool operator==(const Person &p)
    {
        if (this->m_Age == p.m_Age)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    string m_Name;
    int m_Age;
};
class AgeGreater20
{
public:
    bool operator()(const Person &p)
    {
        return p.m_Age > 20;
    }
};
void test02()
{
    vector<Person> v;
    Person p1("刘备", 35);
    Person p2("关羽", 45);
    Person p3("张飞", 56);
    Person p4("赵云", 33);

    // 将人员插入到容器中
    v.push_back(p1);
    v.push_back(p2);
    v.push_back(p3);
    v.push_back(p4);

    // 统计 大于20的人数

    Person p("诸葛亮", 33);

    int num = count_if(v.begin(), v.end(), AgeGreater20());
    cout << "大于20的人数的人员个数为:" << num << endl;
}

int main()
{
    // test01();
    test02();
    system("pause");
    return 0;
}

5.3常用排序算法
学习目标:
●掌握常用的排序算法
算法简介: .
        ●sort        //对容器内元素进行排序
        ●random_shuffle  //洗牌 指定范围内的元素随机调整次序
        ●merge        //容器元素合并,并存储到另-容器中
        ●reverse        //反转指定范围的元素
5.3.1 sort
功能描述: .
        ●对容器内元素进行排序
函数原型:
        sort(iterator beg, iterator end,_ Pred);
                //按值查找元素,找到返回指定位置迭代器,找不到返回结束迭代器位置
        //beg 开始迭代器

        // end 结束迭代器
        //_ Pred谓词

案例:

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

// 常用排序算法 sort
void MyPrint(int val)
{
    cout << val << " ";
}
void test01()
{
    vector<int> v;
    v.push_back(10);
    v.push_back(40);
    v.push_back(30);
    v.push_back(40);
    v.push_back(50);
    v.push_back(60);

    // 利用sort进行升序
    sort(v.begin(), v.end());
    for_each(v.begin(), v.end(), MyPrint);
    cout << endl;

    // 改为 降序
    sort(v.begin(), v.end(), greater<int>());
    for_each(v.begin(), v.end(), MyPrint);
    cout << endl;
};

int main()
{
    test01();
    system("pause");
    return 0;
}

总结: sort属于开发中最常用的算法之一,需熟练掌握
5.3.2 random_shuffle
功能描述:
●洗牌指定范围内的元素随机调整次序
函数原型:
●random_ shuffle(iterator bleg, iterator end);
        //指定范围内的元素随机调整次序
        // beg开始迭代器
        // end结束迭代器
示例:

#include <iostream>
using namespace std;
#include <algorithm>
#include <vector>
#include <functional>
#include <ctime>

// 常用排序算法 random_shuffle
void MyPrint(int val)
{
    cout << val << " ";
}
void test01()
{
    srand((unsigned int)time(NULL));
    vector<int> v;
    for (int i = 0; i < 10; i++)
    {
        v.push_back(i);
    }
    // 利用洗牌 算法 打算顺序
    random_shuffle(v.begin(), v.end());

    for_each(v.begin(), v.end(), MyPrint);
    cout << endl;
};

int main()
{
    test01();
    system("pause");
    return 0;
}

总结: random_shufle洗牌算法比较实用,使用时记得加随机数种子

5.3.3 merge
功能描述:
●两个容器元素合并,并存储到另-容器中
函数原型:
●merge(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest);
        //容器元素合并,并存储到另-容器中
        //注意:两个容器必须是有序的
        // beg1容器 1开始迭代器
        //end1容器1结束迭代在缓冲 - O0KB/s
        // beg2容器2开始迭代器
        // end2容器2结束迭代器
        // dest目标容器开始迭代器
示例:

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

// 常用排序算法 merge
void MyPrint(int val)
{
    cout << val << " ";
}
void test01()
{
    vector<int> v1;
    vector<int> v2;
    for (int i = 0; i < 10; i++)
    {
        v1.push_back(i);
        v2.push_back(i + 1);
    }

    // 目标容器
    vector<int> vTarge;
    vTarge.resize(v1.size() + v2.size());
    merge(v1.begin(), v1.end(), v2.begin(), v2.end(), vTarge.begin());

    for_each(vTarge.begin(), vTarge.end(), MyPrint);
    cout << endl;
};

int main()
{
    test01();
    system("pause");
    return 0;
}

总结: merge合并的两个容器必须的有序序列
5.3.4 reverse
功能描述:
●将容器内元素进行反转
函数原型:
●reverse(iterator beg, iterator end) ;
        //反转指定范围的元素
        // beg开始迭代器
        // end结束迭代器
示例:

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

// 常用排序算法 reverse
void MyPrint(int val)
{
    cout << val << " ";
}
void test01()
{
    vector<int> v;
    v.push_back(10);
    v.push_back(30);
    v.push_back(50);
    v.push_back(40);
    v.push_back(10);

    cout << "反转前:" << endl;
    for_each(v.begin(), v.end(), MyPrint);
    cout << endl;

    cout << "反转后:" << endl;
    reverse(v.begin(), v.end());
    for_each(v.begin(), v.end(), MyPrint);
    cout << endl;
};

int main()
{
    test01();
    system("pause");
    return 0;
}

总结: reverse反转区间内元素,面试题可能涉及到
5.4常用拷贝和替换算法
学习目标:
        ●掌握常用的拷贝和替换算法
算法简介:
        ●copy        //容器内指定范围的元素拷贝到另一容器中
        ●replace        //将容器内指定范围的旧元素修改为新元素
        ●replace_ if        //容器内指定范围满足条件的元素替换为新元素
        ●swap        //互换两个容器的元素
5.4.1 copy
功能描述:
        ●容器内指定范围的元素拷贝到另一容器中
函数原型:
          ●copy(iterator beg, iterator end, iterator dest);
                //按值查找元素,找到返回指定位置迭代器,找不到返回结束迭代器位置
                // beg开始迭代器
                // end结束迭代器
                // dest目标起始迭代器
示例:

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

// 常用拷贝和替换算法 copy
void MyPrint(int val)
{
    cout << val << " ";
}
void test01()
{
    vector<int> v1;
    for (int i = 0; i < 10; i++)
    {
        v1.push_back(i);
    }

    vector<int> v2;
    v2.resize(v1.size());
    copy(v1.begin(), v1.end(), v2.begin());

    for_each(v2.begin(), v2.end(), MyPrint);
    cout << endl;
};

int main()
{
    test01();
    system("pause");
    return 0;
}

总结:利用copy算法在拷贝时,目标容器记得提前开辟空间

5.4.2 replace
功能描述:
        ●将容器内指定范围的旧元素修改为新元素
函数原型:
        ●replace(iterator beg, iterator end, oldvalue, newvalue);
                //将区间内旧元素替换成新元素
                // beg开始迭代器
                // end结束迭代器
                // oldvalue旧元素
                // newvalue新元素
示例:

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

// 常用拷贝和替换算法 replace
class MyPrint
{
public:
    void operator()(int val)
    {
        cout << val << " ";
    }
};
void test01()
{
    vector<int> v;
    v.push_back(10);
    v.push_back(30);
    v.push_back(20);
    v.push_back(50);
    v.push_back(60);
    v.push_back(70);
    v.push_back(70);
    v.push_back(10);
    v.push_back(10);

    cout << "替换前:" << endl;
    for_each(v.begin(), v.end(), MyPrint());
    cout << endl;

    // 将20 替换  2000
    replace(v.begin(), v.end(), 20, 2000);
    cout << "替换后:" << endl;
    for_each(v.begin(), v.end(), MyPrint());
    cout << endl;
};

int main()
{
    test01();
    system("pause");
    return 0;
}

总结: replace会替换区间内满足条件的元素
5.4.3 replace_if
功能描述:
        ●将区间内满足条件的元素,替换成指定元素
函数原型:
        ●replace_ if(iterator beg, iterator end,_ pred, newvalue);
                //按条件替换元素,满足条件的替换成指定元素
                // beg开始迭代器
                // end结束迭代器
                // _pred谓词
                // newvalue替换的新元素
示例:

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

// 常用拷贝和替换算法 replace_if
class MyPrint
{
public:
    void operator()(int val)
    {
        cout << val << " ";
    }
};
class Greater30
{
public:
    bool operator()(int val)
    {
        return val > 30;
    }
};
void test01()
{
    vector<int> v;
    v.push_back(10);
    v.push_back(30);
    v.push_back(20);
    v.push_back(50);
    v.push_back(60);
    v.push_back(70);
    v.push_back(70);
    v.push_back(10);
    v.push_back(10);

    cout << "替换前:" << endl;
    for_each(v.begin(), v.end(), MyPrint());
    cout << endl;

    // 将大于等于30 替换  3000
    replace_if(v.begin(), v.end(), Greater30(), 3000);
    cout << "替换后:" << endl;
    for_each(v.begin(), v.end(), MyPrint());
    cout << endl;
};

int main()
{
    test01();
    system("pause");
    return 0;
}

总结: replace_if按条件查找,可以利用仿函数灵活筛选满足的条件
5.4.4 swap
功能描述:
●互换两个容器的元素
函数原型:
        ●swap(container C1, container C2);
                //互换两个容器的元素
                // C1容器1
                // c2容器2
示例: .

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

// 常用拷贝和替换算法 swap
class MyPrint
{
public:
    void operator()(int val)
    {
        cout << val << " ";
    }
};
class Greater30
{
public:
    bool operator()(int val)
    {
        return val > 30;
    }
};
void test01()
{
    vector<int> v1;
    vector<int> v2;

    for (int i = 0; i < 10; i++)
    {
        v1.push_back(i);
        v2.push_back(i + 100);
    }

    cout << "交换前:" << endl;
    for_each(v1.begin(), v1.end(), MyPrint());
    cout << endl;
    for_each(v2.begin(), v2.end(), MyPrint());
    cout << endl;

    cout << "-------------" << endl;
    // 交换后
    cout << "替换后:" << endl;
    swap(v1, v2);
    for_each(v1.begin(), v1.end(), MyPrint());
    cout << endl;
    for_each(v2.begin(), v2.end(), MyPrint());
    cout << endl;
};

int main()
{
    test01();
    system("pause");
    return 0;
}

总结: swap交换容器时,注意交换的容器要同种类型
5.5常用算术生成算法
学习目标:
        ●掌握常用的算术生成算法
注意:
        ●算术生成算法属于小型算法,使用时包含的头文件为#include <numeric>
算法简介:
        ●accumulate        //计算容器元素累计总和
        ●fill        //向容器中添加元素
5.5.1 accumulate
功能描述:
●计算区间内容器元素累计总和

函数原型:
        ●accumulate(iterator beg, iterator end, value);
                //计算容器元素累计总和
                // beg开始迭代器
                // end结束迭代器
                // value起始值
示例:

#include <iostream>
using namespace std;
#include <vector>
#include <numeric>
// 常用算术生成算法 accumulate

void test01()
{
    vector<int> v;
    for (int i = 0; i <= 100; i++)
    {
        v.push_back(i);
    }

    // 参数3  起始累加值
    int total = accumulate(v.begin(), v.end(), 0);

    cout << "total=" << total << endl;
}

int main()
{
    test01();
    system("pause");
    return 0;
}

总结: accumulate使用时头文件注意是numeric,这个算法很实用
5.5.2 fill 
功能描述:
        ●向容器中填充指定的元素
函数原型:
        ●fill(iterator beg, iterator end, value);
                //向容器中填充元素
                // beg开始迭代器
                // end结束迭代器
                // value填充的值
示例:

#include <iostream>
using namespace std;
#include <vector>
#include <numeric>
#include <algorithm>
// 常用算术生成算法 fill

void myPrint(int val)
{
    cout << val << " ";
}
void test01()
{
    vector<int> v;
    v.resize(10);

    // 后期重新填充
    fill(v.begin(), v.end(), 100);

    for_each(v.begin(), v.end(), myPrint);
}

int main()
{
    test01();
    system("pause");
    return 0;
}

总结:利用fill可以将容器区间内元素填充为指定的值.
5.6常用集合算法
学习目标:
        ●掌握常用的集合算法
算法简介:
        ●set_ intersection        //求两个容器的交集
        ●set_union        //求两个容器的并集
        ●set_ difference        //求两个容器的差集
5.6.1 set intersection
功能描述:
        ●求两个容器的交集
函数原型:
        ●set_ intersection(iterator beg1, iterator end1, iterator beg2, iterator end2,iterator dest);
                //求两个集合的交集
                //注意:两个集合必须是有序序列
                // beg1容器1开始迭代器
                // end1容器1结束迭代器
                // beg2容器2开始迭代器
                // end2容器2结束迭代器
                // dest目标容器开始迭代器
示例:

#include <iostream>
using namespace std;
#include <vector>
#include <algorithm>
// 常用集合算法 set_intersection
void MyPrint(int val)
{
    cout << val << " ";
};
void test01()
{
    vector<int> v1;
    vector<int> v2;
    for (int i = 0; i < 10; i++)
    {
        v1.push_back(i);     // 0~9
        v2.push_back(i + 5); // 5~14
    }

    vector<int> vTarget;
    // 目标容器需要提前开辟空间
    // 最特殊的情况  大容器包含小容器 开辟空间取 小容器的size即可
    vTarget.resize(min(v1.size(), v2.size()));

    // 获取交集
    vector<int>::iterator itEnd = set_intersection(v1.begin(), v1.end(), v2.begin(), v2.end(), vTarget.begin());

    for_each(vTarget.begin(), itEnd, MyPrint);
    cout << endl;
}
int main()
{
    test01();
    system("pause");
    return 0;
}

总结:
●求交集的两个集合必须的有序序列
●目标容器开辟空间需要从两个容器中取小值
●set. _intersection返回值既是交集中最后一 个元素的位置
5.6.2 set_union
功能描述:
        ●求两个集合的并集
函数原型:
        ●set_union(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest);
                //求两个集合的并集
                //注意:两个集合必须是有序序列
                // beg1容器1开始迭代器
                // end1容器1结束迭代器
                // beg2容器2开始迭代器
                // end2容器2结束迭代器
                // dest目标容器开始迭代器
示例:

#include <iostream>
using namespace std;
#include <vector>
#include <algorithm>
// 常用集合算法 set_union
void MyPrint(int val)
{
    cout << val << " ";
};
void test01()
{
    vector<int> v1;
    vector<int> v2;
    for (int i = 0; i < 10; i++)
    {
        v1.push_back(i);     // 0~9
        v2.push_back(i + 5); // 5~14
    }

    vector<int> vTarget;
    // 目标容器需要提前开辟空间
    // 最特殊情况两个容器没有交集,并集就是两个容器size相加
    vTarget.resize(v1.size() + v2.size());

    // 获取并集
    vector<int>::iterator itEnd = set_union(v1.begin(), v1.end(), v2.begin(), v2.end(), vTarget.begin());

    for_each(vTarget.begin(), itEnd, MyPrint);
    cout << endl;
}
int main()
{
    test01();
    system("pause");
    return 0;
}

总结:
        ●求并集的两个集合必须的有序序列
        ●目标容器开辟空间需 要两个容器相加
        ●set_union返回值既是并集中最后一个元素的位置

5.6.3 set_ difference
功能描述: .
        ●求两个集合的差集
函数原型: .
        ●set_difference(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest);
                //求两个集合的差集
                //注意:两个集合必须是有序序列
                // beg1容器1开始迭代器
                // end1容器1结束迭代器
                // beg2容器2开始迭代器
                // end2容器2结束迭代器
                // dest目标容器开始迭代器
示例:

#include <iostream>
using namespace std;
#include <vector>
#include <algorithm>
// 常用集合算法 set_difference
void MyPrint(int val)
{
    cout << val << " ";
};
void test01()
{
    vector<int> v1;
    vector<int> v2;
    for (int i = 0; i < 10; i++)
    {
        v1.push_back(i);     // 0~9
        v2.push_back(i + 5); // 5~14
    }

    vector<int> vTarget;
    // 目标容器需要提前开辟空间
    // 最特殊情况两 个容器没有交集取两个容器中大的size作为目标容器开辟空间
    vTarget.resize(max(v1.size(), v2.size()));

    // 获取差集
    cout << "v1和v2的差集:" << endl;
    vector<int>::iterator itEnd = set_difference(v1.begin(), v1.end(), v2.begin(), v2.end(), vTarget.begin());

    for_each(vTarget.begin(), itEnd, MyPrint);
    cout << endl;

    cout << "v2和v1的差集:" << endl;
    itEnd = set_difference(v2.begin(), v2.end(), v1.begin(), v1.end(), vTarget.begin());

    for_each(vTarget.begin(), itEnd, MyPrint);
    cout << endl;
}
int main()
{
    test01();
    system("pause");
    return 0;
}

总结:
●求差集的两个集合必须的有序序列
●目标容器开辟空间需要从两个容器取较大值
●set_difference返回值既是差集中最后一个元素的位置
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值