标签:
C++中的STL(Standard Template Library)用起来挺方便的,这里我们来做一下总结。
一、set
set是STL中一种标准关联容器 (vector,list,string,deque都是序列容器,而set,multiset,map,multimap是标准关联容器),它底层使用 平衡的搜索树——红黑树实现,插入删除操作时仅仅需要指针操作节点即可完成,不涉及到内存移动和拷贝,所以效率比较高。
在set中元素都是唯一的,而且默认情况下会对元素 自动进行升序排列,支持集合的交(set_intersection),差(set_difference) 并(set_union),对称差(set_symmetric_difference) 等一些集合上的操作,如果需要集合中的元素允许重复那么可以使用multiset。
1)插入(insert)
set的元素添加时使用insert()方法,示例如下:
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 int main(){ 5 set<int>s; 6 int n; 7 cout << "input: "; 8 for(int i = 0; i < 5; i++){ 9 cin >> n; 10 s.insert(n); 11 } 12 cout << "output: "; 13 for(set<int>::iterator it = s.begin(); it != s.end(); ++it){ 14 cout << *it << ‘ ‘; 15 } 16 }
运行结果如下:
可见set已为我们剔除了相同的元素了,并且默认升序输出。假如我们想构造一个升序的set,可以这样声明:set<int, greater<int>> s ;
2)历遍
set的历遍一般是用迭代器iterator,这是对指针的封装,示例代码如上。
3)初始化
我们可以使用数组来进行初始化,或者用复制构造函数:
1 int main(){ 2 int A[3] = {1, 2, 3}; 3 set<int> setA(A, A + 3); 4 set<int> setB(setA); 5 }
4)并集、交集、差集
利用set的方法可以方便地求出并集、交集和差集:
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 int main(){ 5 int A[3] = {1, 2, 3}; 6 int B[4] = {1, 2, 4, -1}; 7 set<int> setA(A, A + 3); 8 set<int> setB(B, B + 4); 9 set<int> set1, set2, set3; 10 11 set_union(setA.begin(), setA.end(), setB.begin(), setB.end(), insert_iterator<set<int>>(set1, set1.begin())); 12 set_intersection(setA.begin(), setA.end(), setB.begin(), setB.end(), insert_iterator<set<int>>(set2, set2.begin())); 13 set_difference(setA.begin(), setA.end(), setB.begin(), setB.end(), insert_iterator<set<int>>(set3, set3.begin())); 14 15 cout << "union: "; 16 for(set<int>::iterator it = set1.begin(); it != set1.end(); ++it) cout << *it << ‘ ‘; cout << endl; 17 18 cout << "intersection: "; 19 for(set<int>::iterator it = set2.begin(); it != set2.end(); ++it) cout << *it << ‘ ‘; cout << endl; 20 21 cout << "difference: "; 22 for(set<int>::iterator it = set3.begin(); it != set3.end(); ++it) cout << *it << ‘ ‘; cout << endl; 23 }
三个函数的参数都类似,运行效果如下:
//To be continued.
标签:
原文地址:http://www.cnblogs.com/Vincent-Bryan/p/5579233.html