📜  在C++中使用STL合并操作| merge(),includes(),set_union(),set_intersection(),set_difference(),。,inplace_merge,(1)

📅  最后修改于: 2023-12-03 14:51:15.067000             🧑  作者: Mango

在C++中使用STL合并操作

在C++的STL中,有许多可以方便地实现合并操作的函数,这些函数包括merge()includes()set_union()set_intersection()set_difference()inplace_merge()

这些函数可以用来合并两个有序的容器,查找一个容器是否包含另一个容器,计算两个容器的交集、并集和差集等。

下面将分别介绍每个函数的用法和示例。

merge()

merge()可以将两个有序的容器合并成一个新的有序容器,并返回这个新的容器。这个函数的用法是:

template<class InputIt1, class InputIt2, class OutputIt>
OutputIt merge(InputIt1 first1, InputIt1 last1, InputIt2 first2, InputIt2 last2,
                   OutputIt d_first);

其中,first1last1是第一个有序容器的起始和结束位置,first2last2是第二个有序容器的起始和结束位置,d_first是合并后的新容器的起始位置。

示例:

#include <iostream>
#include <algorithm>
#include <vector>

int main()
{
    std::vector<int> v1 = {1, 3, 5, 7};
    std::vector<int> v2 = {2, 4, 6, 8, 9};

    std::vector<int> v3(v1.size() + v2.size());

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

    for (auto n : v3)
        std::cout << n << ' ';

    return 0;
}

输出:

1 2 3 4 5 6 7 8 9
includes()

includes()可以判断一个有序容器是否包含另一个容器,并返回一个bool值。这个函数的用法是:

template<class InputIt1, class InputIt2>
bool includes(InputIt1 first1, InputIt1 last1, InputIt2 first2, InputIt2 last2);

其中,first1last1是第一个有序容器的起始和结束位置,first2last2是要查找的容器的起始和结束位置。

示例:

#include <iostream>
#include <algorithm>
#include <vector>

int main()
{
    std::vector<int> v1 = {1, 2, 3, 4, 5, 6};
    std::vector<int> v2 = {2, 4, 6};

    bool result = std::includes(v1.begin(), v1.end(), v2.begin(), v2.end());

    if (result)
        std::cout << "v1 contains v2" << std::endl;
    else
        std::cout << "v1 does not contain v2" << std::endl;

    return 0;
}

输出:

v1 contains v2
set_union()

set_union()可以计算两个有序容器的并集,并将结果存储到一个新的有序容器中。这个函数的用法是:

template<class InputIt1, class InputIt2, class OutputIt>
OutputIt set_union(InputIt1 first1, InputIt1 last1, InputIt2 first2, InputIt2 last2,
                       OutputIt d_first);

其中,first1last1是第一个有序容器的起始和结束位置,first2last2是第二个有序容器的起始和结束位置,d_first是存储结果的新容器的起始位置。

示例:

#include <iostream>
#include <algorithm>
#include <vector>

int main()
{
    std::vector<int> v1 = {1, 3, 5, 7};
    std::vector<int> v2 = {2, 4, 6, 8, 9};

    std::vector<int> v3(v1.size() + v2.size());

    std::set_union(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.begin());

    for (auto n : v3)
        std::cout << n << ' ';

    return 0;
}

输出:

1 2 3 4 5 6 7 8 9
set_intersection()

set_intersection()可以计算两个有序容器的交集,并将结果存储到一个新的有序容器中。这个函数的用法是:

template<class InputIt1, class InputIt2, class OutputIt>
OutputIt set_intersection(InputIt1 first1, InputIt1 last1, InputIt2 first2, InputIt2 last2,
                               OutputIt d_first);

其中,first1last1是第一个有序容器的起始和结束位置,first2last2是第二个有序容器的起始和结束位置,d_first是存储结果的新容器的起始位置。

示例:

#include <iostream>
#include <algorithm>
#include <vector>

int main()
{
    std::vector<int> v1 = {1, 2, 3, 4, 5, 6};
    std::vector<int> v2 = {2, 4, 6};

    std::vector<int> v3(std::min(v1.size(), v2.size()));

    std::set_intersection(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.begin());

    for (auto n : v3)
        std::cout << n << ' ';

    return 0;
}

输出:

2 4 6
set_difference()

set_difference()可以计算两个有序容器的差集,并将结果存储到一个新的有序容器中。这个函数的用法是:

template<class InputIt1, class InputIt2, class OutputIt>
OutputIt set_difference(InputIt1 first1, InputIt1 last1, InputIt2 first2, InputIt2 last2,
                             OutputIt d_first);

其中,first1last1是第一个有序容器的起始和结束位置,first2last2是要从第一个容器中剔除的容器的起始和结束位置,d_first是存储结果的新容器的起始位置。

示例:

#include <iostream>
#include <algorithm>
#include <vector>

int main()
{
    std::vector<int> v1 = {1, 2, 3, 4, 5, 6};
    std::vector<int> v2 = {2, 4, 6};

    std::vector<int> v3(v1.size());

    std::set_difference(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.begin());

    for (auto n : v3)
        std::cout << n << ' ';

    return 0;
}

输出:

1 3 5
inplace_merge()

inplace_merge()可以将一个有序容器的前后两个部分合并成一个有序容器。这个函数的用法是:

template<class BidirIt>
void inplace_merge(BidirIt first, BidirIt middle, BidirIt last);

其中,firstmiddle分别是待合并的前后两个部分的起始位置,last是整个容器的结尾位置。

示例:

#include <iostream>
#include <algorithm>
#include <vector>

int main()
{
    std::vector<int> v1 = {1, 3, 5, 2, 4, 6};

    std::inplace_merge(v1.begin(), v1.begin() + 3, v1.end());

    for (auto n : v1)
        std::cout << n << ' ';

    return 0;
}

输出:

1 2 3 4 5 6

以上就是在C++中使用STL合并操作的介绍。通过这些函数,我们可以更方便地进行容器的操作,从而提高程序的效率和可读性。