c++ set<string> 集合做差集

#include <set>
#include <iostream>
//#include <iterator>
#include <algorithm>
#include <string>

using namespace std;
/**
 * (20条消息) C++拾取——stl标准库中集合交集、并集、差集、对称差方法_方亮的专栏-CSDN博客_c++ 取交集
 * https://blog.csdn.net/breaksoftware/article/details/88932820
 */

int main() {
	set<string> a; // { "1", "3", "3", "4", "4", "5", "6" };
	a.insert("10.0.0.1");
	a.insert("10.0.0.5");
	a.insert("10.0.0.6");
	a.insert("10.0.0.2");
	a.insert("10.0.0.2");
	a.insert("10.0.0.4");
	a.insert("10.0.0.9");

	std::set<string> b; // { "2", "3", "4", "4", "5", "5", "7" };
	b.insert("10.0.0.2");
	b.insert("10.0.0.5");
	b.insert("10.0.0.6");
	b.insert("10.0.0.4");
	b.insert("10.0.0.7");

	cout << "集合a :" << endl;
	for (string iter : a) {
		cout << iter << endl;
	}

	cout << "集合b :" << endl;
	for (string iter : b) {
		cout << iter << endl;
	}

	std::set<string> result;

	//set_difference 需要取差集的两个集合先排序并去掉重复元素。集合初始化后就自动去重排序了
	std::set_difference(a.begin(), a.end(), b.begin(), b.end(),
			inserter(result, result.begin()));

//	std::copy(result.begin(), result.end(),
//			ostream_iterator<string>(std::cout, " "));
	cout << "集合a 和 b 取差集" << endl;
	for (string iter : result) {
		cout << iter << endl;
	}
	return 0;
}

这里需要强调的是在调用set_difference 对两个集合做差集操作前,两个集合一定是去重并且排序了的。这一点很重!不去重或者不排序,都会出现问题。由于set<string>在初始化的时候就已经进行了去重和排序,所以这里没有显示地进行去重排序。如果用vector<string>,则需要我们自己手动添加去重和排序相关代码。详见:

(20条消息) c++ vector<string> 集合做差集_Jerry_liu20080504的专栏-CSDN博客
https://blog.csdn.net/Jerry_liu20080504/article/details/123128417

具体原因:

Equivalent elements are treated individually, that is, if some element is found m times in [first1, last1) and n times in [first2, last2), it will be copied to d_first exactly std::max(m-n, 0) times. The resulting range cannot overlap with either of the input ranges.

参考并感谢以下链接:

(20条消息) C++拾取——stl标准库中集合交集、并集、差集、对称差方法_方亮的专栏-CSDN博客_c++ 取交集
https://blog.csdn.net/breaksoftware/article/details/88932820
 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值