📅  最后修改于: 2023-12-03 14:51:15.067000             🧑  作者: Mango
在C++的STL中,有许多可以方便地实现合并操作的函数,这些函数包括merge()
,includes()
,set_union()
,set_intersection()
,set_difference()
和inplace_merge()
。
这些函数可以用来合并两个有序的容器,查找一个容器是否包含另一个容器,计算两个容器的交集、并集和差集等。
下面将分别介绍每个函数的用法和示例。
merge()
可以将两个有序的容器合并成一个新的有序容器,并返回这个新的容器。这个函数的用法是:
template<class InputIt1, class InputIt2, class OutputIt>
OutputIt merge(InputIt1 first1, InputIt1 last1, InputIt2 first2, InputIt2 last2,
OutputIt d_first);
其中,first1
和last1
是第一个有序容器的起始和结束位置,first2
和last2
是第二个有序容器的起始和结束位置,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()
可以判断一个有序容器是否包含另一个容器,并返回一个bool值。这个函数的用法是:
template<class InputIt1, class InputIt2>
bool includes(InputIt1 first1, InputIt1 last1, InputIt2 first2, InputIt2 last2);
其中,first1
和last1
是第一个有序容器的起始和结束位置,first2
和last2
是要查找的容器的起始和结束位置。
示例:
#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()
可以计算两个有序容器的并集,并将结果存储到一个新的有序容器中。这个函数的用法是:
template<class InputIt1, class InputIt2, class OutputIt>
OutputIt set_union(InputIt1 first1, InputIt1 last1, InputIt2 first2, InputIt2 last2,
OutputIt d_first);
其中,first1
和last1
是第一个有序容器的起始和结束位置,first2
和last2
是第二个有序容器的起始和结束位置,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()
可以计算两个有序容器的交集,并将结果存储到一个新的有序容器中。这个函数的用法是:
template<class InputIt1, class InputIt2, class OutputIt>
OutputIt set_intersection(InputIt1 first1, InputIt1 last1, InputIt2 first2, InputIt2 last2,
OutputIt d_first);
其中,first1
和last1
是第一个有序容器的起始和结束位置,first2
和last2
是第二个有序容器的起始和结束位置,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()
可以计算两个有序容器的差集,并将结果存储到一个新的有序容器中。这个函数的用法是:
template<class InputIt1, class InputIt2, class OutputIt>
OutputIt set_difference(InputIt1 first1, InputIt1 last1, InputIt2 first2, InputIt2 last2,
OutputIt d_first);
其中,first1
和last1
是第一个有序容器的起始和结束位置,first2
和last2
是要从第一个容器中剔除的容器的起始和结束位置,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()
可以将一个有序容器的前后两个部分合并成一个有序容器。这个函数的用法是:
template<class BidirIt>
void inplace_merge(BidirIt first, BidirIt middle, BidirIt last);
其中,first
和middle
分别是待合并的前后两个部分的起始位置,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合并操作的介绍。通过这些函数,我们可以更方便地进行容器的操作,从而提高程序的效率和可读性。