精华内容
参与话题
问答
  • 谭浩强C语言C++集合

    2018-08-06 16:01:53
    谭浩强C语言C++集合包,是一个包含多个关于谭浩强C语言,与C++初学者入门的资料集合。
  • C++集合类模板

    2020-01-28 21:17:10
    C++集合类模板 set类模板又称为集合类模板,一个集合对象像链表一样顺序地存储一组值。在一个集合中,集合元素既充当存储的数据,又充当数据的关键码。 创建set链表类模板的方法: #include<set> //调用set...

    C++集合类模板

    set类模板又称为集合类模板,一个集合对象像链表一样顺序地存储一组值。在一个集合中,集合元素既充当存储的数据,又充当数据的关键码。

    创建set链表类模板的方法:

    #include<set>		//调用set头文件
    	...
    	...
    set<type>s;			//定义一个set
    //set表示声明一个集合类模板,<type>表示集合的类型,s表示集合名。
    
    

    set对象主要成员函数说明:

    只是一些常用的,其它还有很多。

    函数 说明
    begin 返回指向集合第一个元素的迭代器
    end 返回指向集合最后一个元素的迭代器
    size 返回集合的大小
    clear 删除集合中所有元素
    count(x) 返回集合中值为x的元素个数
    find(x) 返回一个指向x的迭代器,若x不存在,则返回end
    erase(start,end) 删除迭代器从start到end范围内的向量
    erase(i) 删除迭代器第i个元素
    insert(i,x) 把值x插入到由迭代器指明的第i个位置
    insert(i,start,end) 把迭代器从start到end范围的元素插入到指明的第i个位置
    insert(i,n,x) 把x的n个副本插入到由迭代器指明的第i个位置
    swap(set) 交换两个集合的内容

    值得注意的是,集合无法通过索引进行赋值和输入输出。

    迭代器

    对set集合的各个元素的访问,通常使用迭代器。

    迭代器定义方法:

    set<int>::iterator it=s.begin();
    

    定义了一个迭代器it指向set集合s的开始指针。

    set集合与迭代器的入门应用

    插入操作

    	set<int>s;
    	s.insert(1);s.insert(3);s.insert(5);
    	s.insert(7);s.insert(9);s.insert(11);
    	set<int>::iterator it;
    	for(it=s.begin();it!=s.end();it++)
    		cout<<*it<<" ";
    

    给大家做一下解释,
    先是定义一个int类型的set集合s,重复插入操作6次。
    定义一个迭代器it,it=s.begin()初始化指向s的头指针。
    然后通过it++遍历输出s的所有元素。
    输出结果为:1 3 5 7 9 11

    需要注意的是,for循环终止条件为it!=s.end(),当it=s.end()时,it指向的是s的最后元素的下一个空元素,而非最后元素

    删除操作

    承接插入操作继续运行

    	s.erase(--it); 
    	for(it=s.begin();it!=s.end();it++)
    		cout<<*it<<" ";
    

    通过s.erase(- -it); 删除s最后一个元素,
    输出结果为:1 3 5 7 9

    查找操作

    重新回顾一下查找操作find:
    find(x) 返回一个指向x的迭代器,若x不存在,则返回end。

    承接以上的插入删除操作:

    	it=s.find(5);
    	if(it!=s.end())
    		cout<<"found"<<endl;
    	else
    		cout<<"not found"<<endl;
    	it=s.find(13);
    	if(it!=s.end())
    		cout<<"found"<<endl;
    	else
    		cout<<"not found"<<endl;
    

    输出结果为:
    found
    not found

    三合一源代码

    #include<iostream>
    #include<set>
    using namespace std; 
    int main(){
    	
    	set<int>s;
    	s.insert(1);s.insert(3);s.insert(5);
    	s.insert(7);s.insert(9);s.insert(11);
    	set<int>::iterator it;
    	for(it=s.begin();it!=s.end();it++)
    		cout<<*it<<" ";
    	cout<<endl;
    	
    	s.erase(--it); 
    	for(it=s.begin();it!=s.end();it++)
    		cout<<*it<<" ";
    	cout<<endl;
    	
    	it=s.find(5);
    	if(it!=s.end())
    		cout<<"found"<<endl;
    	else
    		cout<<"not found"<<endl;
    	it=s.find(13);
    	if(it!=s.end())
    		cout<<"found"<<endl;
    	else
    		cout<<"not found"<<endl;
    }
    

    结果图:
    set

    展开全文
  • C++集合操作之集合交集:std::set_intersection 算法set_intersection可以用来求两个集合的交集,此处的集合可以为std::set,也可以是std::multiset,但是不可以是hash_set以及hash_multiset。为什么呢?因为set_...

    C++集合操作之集合交集:std::set_intersection

       算法set_intersection可以用来求两个集合的交集,此处的集合可以为std::set,也可以是std::multiset,但是不可以是hash_set以及hash_multiset。为什么呢?因为set_intersection要求两个区间必须是有序的(从小到大排列),std::set和std::multiset为有序序列,而hash_set以及hash_multiset为无序序列。   

       由于两个集合内的每个元素都不需唯一,因此,如果某个值在区间1中出现m次,在区间2中出现n次,那么该值在输出区间中会出现min(m,n)次,且全部来自于区间1.函数返回值为一个迭代器,指向输出区间的尾部。

       set_intersection为稳定操作,即输出区间内的每个元素的相对顺序都和区间1内的相对顺序相同。

    一定谨记:两个区间必须是有序区间(从小到大)

    源码如下:

     

    [cpp] view plain copy
     
     print?
    1. template<class InputIterator1,class InputIterator2,class OutputIterator>  
    2. OutputIterator set_intersection(InputIterator1 first1,InputIterator1 last1,InputIterator2 first2,InputIterator2 last2,OutputIterator result)  
    3. {  
    4.     while (first1!=last1 && first2!=last2) //若均未到达尾端,则进行以下操作  
    5.     {  
    6.         //在两个区间内分别移动迭代器。若二者值相同用result记录该值,移动first1,first2和result  
    7.         //若first1较小,则移动first1,其他不动  
    8.         //若first2较小,则移动first2,其他不动  
    9.         if (*first1<*first2)           
    10.             first1++;             
    11.         else if (*first2<*first1)              
    12.             first2++;         
    13.         else  
    14.         {     
    15.             *result=*first1;  
    16.             first1++;  
    17.             first2++;         
    18.             result++;  
    19.         }         
    20.     }     
    21.     return result;    
    22. }  

    示例:

     

     

    [cpp] view plain copy
     
     print?
    1. int main(void)  
    2. {  
    3.     int iarr1[]={1,2,3,3,4,5,6,7,9};  
    4.     int iarr2[]={1,4,3,9,10};  
    5.     multiset<int> iset1(begin(iarr1),end(iarr1));  
    6.     multiset<int> iset2(begin(iarr2),end(iarr2));  
    7.     vector<int> ivec(20);      
    8.     auto iter=set_intersection(iset1.begin(),iset1.end(),iset2.begin(),iset2.end(),ivec.begin());   //ivec为:1,3,4,9  
    9.     ivec.resize(iter-ivec.begin());//重新确定ivec大小  
    10.     return 0;  
    11. }  


    其实 ,上述代码并不仅限于对两个集合取交集,只要是两个有序区间,均可以用此代码求交集。

     

     

     

    用于非set场合:

    [cpp] view plain copy
     
     print?
    1. int main(void)  
    2. {  
    3.     int iarr1[]={1,2,3,3,6,7,4,5};  
    4.     int iarr2[]={1,4,3,10,9};  
    5.     std::sort(begin(iarr1),end(iarr1));  
    6.     std::sort(begin(iarr2),end(iarr2));  
    7.     vector<int> ivec(10);    
    8.     auto iter=set_intersection(begin(iarr1),end(iarr1),begin(iarr2),end(iarr2),ivec.begin());   //ivec为:1,2,4,9  
    9.     ivec.resize(iter-ivec.begin());//重新确定ivec大小  
    10.     return 0;  
    11. }  
    12.  
    展开全文
  • C++集合-初识Set

    2020-04-19 18:07:02
    C++集合-初识Set Set是C++中模板库的一个STL库,Set就像英文中的意思一样是集合1,关于集合必须说明set是关联式容器。set作为容器,也是用来存储同一数据类型的数据类型,并且能从一个数据集合中取出数据,在set中每...

    C++集合-初识Set

    Set是C++中模板库的一个STL库,Set就像英文中的意思一样是集合1,关于集合必须说明set是关联式容器。set作为容器,也是用来存储同一数据类型的数据类型,并且能从一个数据集合中取出数据,在set中每个元素的值都唯一,而且系统能够根据元素的值自动进行排序。应该注意的是set中的值不能被直接改变
    C++ STL中标准关联容器set, multiset, map, multimap内部采用的就是一种非常高效的平衡检索二叉树:红黑树,也成为RB树(Red-Black Tree)。RB树的统计性能要好于一般平衡二叉树,所以被STL选择作为了关联容器的内部结构。

    为什么map和set的插入删除效率比用其他序列容器高?

    因为对于关联容器来说,不需要做内存拷贝和内存移动。set容器内所有元素都是以节点的方式来存储,其节点结构和链表差不多,指向父节点和子节点。结构图可能如下:

       A
      / \
      B   C
     / \ / \
    D  E F  G
    

    set常用方法

    
    begin()——返回set容器的第一个元素
    end()——返回set容器的最后一个 元素
    clear()——删除set容器中的所有的元素
    empty()——判断set是否为空,返回类型为布尔
    max_size()——返回set可能包含的元素最大个数
    size()——返回当前set容器中的元素个数
    rbegin()——返回的值和end()相同
    rend()——返回的值和rbegin()相同
    

    引入头文件:

    需要调用STL库:#include <set>

    来写一个程序练一练其基本用法

    #include <iostream>
    #include <set>
    
    using namespace std;
    
    int main()
    {
        set<int> myset;
        for (int i = 0; i < 10; i++)
            myset.insert(10 - i);
        
        cout << "第一个元素:" << endl;
        cout << *myset.begin() << endl; //星号
        cout << "最后一个元素:" << endl;
        cout << *myset.end() << endl;
        cout << "是否为空?" << endl;
        cout << boolalpha << myset.empty() << endl;
        cout << "元素个数:" << endl;
        cout << myset.size() << endl;
        cout << "某个值元素的个数:" << endl;
        cout << myset.count(1) << endl;
    
        //删除
        myset.erase(myset.begin());
        myset.erase(2);
    
        //遍历set集合
        set<int>::iterator it1; //迭代器
        for (it1 = myset.begin(); it1 != myset.end(); it1++)
            cout << *it1 << endl;
        return 0;
    }
    

    运行结果:

    第一个元素:
    1
    最后一个元素:
    10
    是否为空?
    false
    元素个数:
    10
    某个值元素的个数:
    1
    3
    4
    5
    6
    7
    8
    9
    10
    

    1. n. (物品的)一套,一组,一副;一伙(或一帮)人,团伙,阶层;电视机,收音机;布置,场景,舞台;(网球、排球比赛等的)盘,局;(数学中的)集,集合;一组歌曲(乐曲);(能力相当的)一批学生;(尤指坚定的)姿势,神情;做头发;凝固,凝结;兽穴;(供移植的)秧苗,插枝;装置 ↩︎

    展开全文
  • Microsoft Visual C++集合(2013、2015、2017)最少只能选两分
  • C++集合操作之集合并集:std::set_difference   算法set_difference可以用来求两个集合的差集,此处的集合可以为std::set,也可以是std::multiset,但是不可以是hash_set以及hash_multiset。为什么呢?因为set_...

     

    C++集合操作之集合并集:std::set_difference

     

    算法set_difference可以用来求两个集合的差集,此处的集合可以为std::set,也可以是std::multiset,但是不可以是hash_set以及hash_multiset。为什么呢?因为set_difference要求两个区间必须是有序的(从小到大排列),std::set和std::multiset为有序序列,而hash_set以及hash_multiset为无序序列。

    算法set_difference可构造区间S1,S2的差集(出现于S1但不出现于S2的元素),即S1-S2;返回值为指向输出区间的尾端。
    由于区间S1,S2内的每个元素都不需唯一,因此,如果某个值在S1中出现m次,在S2中出现n次,那么该值在输出区间中出现的次数为max(m-n,0),且全部来自S1。
      set_difference为稳定操作,即输出区间内的每个元素的相对顺序都和S1内的相对顺序相同。

    一定谨记:两个区间必须是有序区间(从小到大)

    源代码如下:

     

    template<class InputIterator1,class InputIterator2,class OutputIterator>
    OutputIterator set_difference(InputIterator1 first1,InputIterator1 last1,InputIterator2 first2,InputIterator2 last2,OutputIterator result)
    {
    	while (first1!=last1 && first2!=last2) //若均未到达尾端,则进行以下操作
    	{
    		//在两个区间内分别移动迭代器。当第一区间的元素等于第二区间的元素时(此值同时存在于两个区间中)
    		//同时移动first1,first2;当第一区间元素大于第二区间元素时,只让第二区间前进;
    		//前两种情况的处理保证了当第一区间元素小于第二区间元素时,第一区间的元素只存在于第一区间,而不存在于第二区间;于是将该值记录,并且移动result		
    		if (*first1<*first2)  
    		{
    			*result=*first1;   //既然走到这一步,说明first2前的元素没有与first1所指元素相同的元素(有序区间的特性)
    			first1++;
    			result++;
    		}
    		else if (*first2<*first1)			
    			first2++;		
    		else
    		{		
    			first1++;
    			first2++;		
    		}		
    	}	
    	return copy(first1,last1,result); 	
    }


    示例:

    int main(void)
    {
    	int iarr1[]={1,2,3,3,4,5,6,7};
    	int iarr2[]={1,4,3,9,10};
    	multiset<int> iset1(begin(iarr1),end(iarr1));
    	multiset<int> iset2(begin(iarr2),end(iarr2));
    	vector<int> ivec(10);  
    	auto iter=set_difference(iset1.begin(),iset1.end(),iset2.begin(),iset2.end(),ivec.begin());	//ivec为:2,3,5,6,7
    	ivec.resize(iter-ivec.begin());//重新确定ivec大小
    	return 0;
    }

    其实 ,上述代码并不仅限于对两个集合求差集,只要是两个有序区间,均可以用此代码求差集。

    用于非set场合:

     

    int main(void)
    {
    	int iarr1[]={1,2,3,3,6,7,4,5};
    	int iarr2[]={1,4,3,10,9};
    	std::sort(begin(iarr1),end(iarr1));
    	std::sort(begin(iarr2),end(iarr2));
    	vector<int> ivec(10);  
    	auto iter=set_difference(begin(iarr1),end(iarr1),begin(iarr2),end(iarr2),ivec.begin());	//ivec为:2,3,5,6,7
    	ivec.resize(iter-ivec.begin());//重新确定ivec大小
    	return 0;
    }
    扫描二维码,关注“小眼睛的梦呓”公众号,在手机端查看文章
    扫描二维码,关注“清远的梦呓”公众号,在手机端查看文章

     

     

     

    展开全文
  • 这份代码用 C++ 的模板类实现了一个集合类 Set,其 API 参考借鉴了 STL 中的 vector 类,采用动态内存及链表进行元素管理,并实现了一些常见的集合算法:并集、交集,也实现了随机下标的存取。
  • C++集合操作之集合并集:std::set_union

    万次阅读 2015-08-13 10:54:23
    C++集合操作之集合并集:std::set_union 算法set_union可以用来求两个集合的并集,此处的集合可以为std::set,也可以是std::multiset,但是不可以是hash_set以及hash_multiset。为什么呢?因为set_union要求两个...
  • c++集合类模板

    2020-04-09 21:34:08
    我真的是一个c++小白了,求问这道题怎么做 设计一个集合类模板,完成集合的并交差运算已给主函数和运行结果(要用重载)
  • C++集合操作之集合对称并集:std::set_symmetric_difference   算法std::set_symmetric_difference可以用来求两个集合的对称差集,此处的集合可以为std::set,也可以是std::multiset,但是不可以是hash_set...
  • c++集合的并交差

    2012-09-11 13:57:17
    c++语言实现集合的并、交、差、插入、删除运算
  • c++集合

    千次阅读 2015-05-24 02:30:47
    #include  #include  #include  using namespace std;... //集合的当前最大容量   int count; //集合的当前元素个数   int *elem;  public:   Set(int initsize=10); //构造函数,创建一个空集
  • C++集合类简介

    千次阅读 2019-03-05 00:02:25
    STL   STL是Standard Template Library的简称,中文名标准模板库,惠普实验室... 从根本上说,STL是一些“容器”的集合,这些“容器”有list,vector,set,map等,STL也是算法和其他一些组件的集合。这里的“容器...
  • C++集合的使用

    2020-12-09 09:39:50
    vector<int> v{ 1, 2, 2, 3, 4, 5, 6, 6, 7, 8, 9, 0 }; binary_search(v.begin(), v.end(), 7); // 折半查找 count(v.begin(), v.end(), 6); // 返回指定元素的个数 count_if(v.begin(), v.end(), [](int x)...
  • C++ 集合set 详解

    万次阅读 多人点赞 2017-07-23 23:42:16
    C++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vector, string, list等方便的容器,更重要的是STL封装了许多复杂的数据结构算法和大量常用数据结构操作。vector封装数组,list封装了链表,map和set...
  • Map map的内部结构是红黑数,所以STL中map默认是按key排序的。 初始化 map&lt;k, v&gt; map; // 定义了一个名为map的空的map对象; map&lt;k, v&gt; map(m2);... // 创建了map对象ma...
  • C++集合set的用法

    2019-07-10 09:06:54
    众所周知STL是C++中十分实用的容器,set便是其中之一。最近做的题都接触到了set(集合),正好学习了一下,将自己的成果写一写。没有接触过的人也可以看看,表示set非常的好用。 (话说最近好久都没有写过博客了) ...
  • c++集合

    2015-04-07 14:37:03
    #include #include using namespace std; #define SIZE 10 #define NULL_DATA -1 class Node { public: Node(int x=SIZE) { data = new int[x]; for(int i=0;i;i++) { data[i] = NULL_DATA;...
  • c++ 集合类运算符重载

    2008-12-24 22:04:53
    c++中,有一种集合类运算符重载的算法,该示例程序中提供了很多的重载类型。
  • C/C++ 集合的加法

    2018-09-26 09:25:10
    给出2个正整数集合A = {pi | 1 &lt;= i &lt;= a},B = {qj | 1 &lt;= j &lt;= b}和一个正整数s。问题是:使得pi + qj = s的不同的(i, j)对有多少个。  输入  第1行是测试数据的组数n,后面跟着n...
  • 前提:两个集合已经有序。merge() //归并两个序列,元素总个数不变,只是将两个有序序列归并为一个有序序列。set_union() //实现求集合A,B的并。set_difference()//实现求集合A,B的差(即A—B)set_symmetric_...
  • C++集合set<int>

    千次阅读 2018-06-24 16:47:29
    set的一些用法
  • c++集合set的方法总结

    千次阅读 2018-03-27 11:36:43
    #include &lt;iostream&gt; #include &lt;set&gt; #include &lt;cstring&gt; #include &lt;algorithm&gt; using namespace std; int main() { set&lt;int&...

空空如也

1 2 3 4 5 ... 20
收藏数 12,661
精华内容 5,064
关键字:

c++集合

c++ 订阅