精华内容
下载资源
问答
  • c++ STL-set

    2018-03-22 16:46:07
    c++ stl集合set介绍 c++ stl集合(Set)是一种包含已排序对象的关联容器。set/multiset会根据待定的排序准则,自动将元素排序。两者不同在于前者不允许元素重复,而后者允许。1) 不能直接改变元素值,因为那样会打乱...

    c++ stl集合set介绍

       c++ stl集合(Set)是一种包含已排序对象的关联容器。set/multiset会根据待定的排序准则,自动将元素排序。两者不同在于前者不允许元素重复,而后者允许。

    1) 不能直接改变元素值,因为那样会打乱原本正确的顺序,要改变元素值必须先删除旧元素,则插入新元素

    2) 不提供直接存取元素的任何操作函数,只能通过迭代器进行间接存取,而且从迭代器角度来看,元素值是常数

    3) 元素比较动作只能用于型别相同的容器(即元素和排序准则必须相同)

    set模板原型://Key为元素(键值)类型

    1
    template  < class  Key,  class  Compare=less<Key>,  class  Alloc=STL_DEFAULT_ALLOCATOR(Key) >

    从原型可以看出,可以看出比较函数对象及内存分配器采用的是默认参数,因此如果未指定,它们将采用系统默认方式。


    set的各成员函数列表如下:

    c++ stl容器set成员函数:begin()--返回指向第一个元素的迭代器

    c++ stl容器set成员函数:clear()--清除所有元素

    c++ stl容器set成员函数:count()--返回某个值元素的个数

    c++ stl容器set成员函数:empty()--如果集合为空,返回true

    c++ stl容器set成员函数:end()--返回指向最后一个元素的迭代器

    c++ stl容器set成员函数:equal_range()--返回集合中与给定值相等的上下限的两个迭代器

    c++ stl容器set成员函数:erase()--删除集合中的元素

    c++ stl容器set成员函数:find()--返回一个指向被查找到元素的迭代器

    c++ stl容器set成员函数:get_allocator()--返回集合的分配器

    c++ stl容器set成员函数:insert()--在集合中插入元素

    c++ stl容器set成员函数:lower_bound()--返回指向大于(或等于)某值的第一个元素的迭代器

    c++ stl容器set成员函数:key_comp()--返回一个用于元素间值比较的函数

    c++ stl容器set成员函数:max_size()--返回集合能容纳的元素的最大限值

    c++ stl容器set成员函数:rbegin()--返回指向集合中最后一个元素的反向迭代器

    c++ stl容器set成员函数:rend()--返回指向集合中第一个元素的反向迭代器

    c++ stl容器set成员函数:size()--集合中元素的数目

    c++ stl容器set成员函数:swap()--交换两个集合变量

    c++ stl容器set成员函数:upper_bound()--返回大于某个值元素的迭代器

    c++ stl容器set成员函数:value_comp()--返回一个用于比较元素间的值的函数


    展开全文
  • C++stl-set查找和统计

    2021-03-10 09:37:45
    C++stl-set查找和统计 功能描述: 对set容器进行查找数据以及统计数据 函数原型: find(可以); //查找key是否已经存在,若存在,返回该键的元素的迭代器,若不存在,返回set,end(); count(key); //统计key的元素...

    C++stl-set查找和统计

    功能描述:

    对set容器进行查找数据以及统计数据
    函数原型:

    find(可以);  //查找key是否已经存在,若存在,返回该键的元素的迭代器,若不存在,返回set,end();
    count(key);       //统计key的元素个数
    

    代码示例:

    #include<iostream>
    #include<set>
    using namespace std;
    //set容器查找和统计
    void test01()
    {
           //查找
           set<int>s1;
           //插入数据
           s1.insert(10);
           s1.insert(20);
           s1.insert(30);
           s1.insert(40);
           set<int>::iterator pos = s1.find(300);
           if (pos != s1.end())
           {
                  cout << "找到元素:" << *pos << endl;
           }
           else
           {
                  cout << "未找到元素:" << endl;
           }
    }
    //统计
    void test02()
    {
           //查找
           set<int>s2;
           //插入数据
           s2.insert(100);
           s2.insert(200);
           s2.insert(300);
           s2.insert(400);
           //统计300的个数
           int num = s2.count(300);
           //对于set而言  统计结果  要么是0  要么是1
           cout << "num=" << num << endl;
    }
    int main()
    {
           //test01();
           test02();
           return 0;
    }
    

    总结:

    查找—find(返回的迭器)

    统计—cout(对set,结果为0或者1)

    展开全文
  • set> #include <string> using namespace std; struct student { int id; string name; }; struct comp//起比较作用的结构体 { bool operator()(const student &a, const student &b) { ...
    #include <iostream>
    #include <set>
    #include <string>
    using namespace std;
    struct student
    {
        int id;
        string name;
    };
    struct comp//起比较作用的结构体
    {
        bool operator()(const student &a, const student &b)
        {
            return a.name < b.name;
        }
    };
    int main()
    {
        set<student,comp> s;
        student s1 = {1,"zy"};
        student s2 = {2,"mzy"};
        student s3 = {3,"ssss"};
        s.insert(s1);
        s.insert(s2);
        s.insert(s3);
        for(set<student,comp>::iterator i =s.begin(); i != s.end(); i++)
        {
            cout << i->id << ' ' << i->name << endl; //用指针类型输出
        }
        return 0;
    }
    

    简单的数据排序定义

    #include <iostream>
    #include <set>
    #include <string>
    using namespace std;
    int main()
    {
        set<int,greater<int> > a; //从小到大改为less
        int b;
        for(int i = 0; i < 5; i++)
        {
            cin >> b;
            a.insert(b);
        }
        for(set<int,less<int> >::iterator i =a.begin(); i != a.end(); i++)
        {
            cout << *i << endl;
        }
        return 0;
    }
    
    展开全文
  • STL--set介绍及set的使用

    万次阅读 多人点赞 2018-08-23 11:52:01
    (1)setSTL中一个很有用的容器,用来存储同一种数据类型的数据结构(可以称之为K的模型),基本功能与数组相似。 (2)set与数组不同的是,在set中每个元素的值都是唯一的。 (3)而且set插入数据时,能够根据...

    1 set介绍

    (1)set是STL中一个很有用的容器,用来存储同一种数据类型的数据结构(可以称之为K的模型),基本功能与数组相似。
    (2)set与数组不同的是,在set中每个元素的值都是唯一的。
    (3)而且set插入数据时,能够根据元素的值自动进行排序。
    (4)set中数元素的值并不能直接被改变。

    2 set的底层

    (1)set的底层是红黑树,是红黑树里面K的模型;

    K模型:表示只能存放同一种数据类型
    KV模型:表示能存放两种数据类型

    (2)map的底层也是红黑树,而它是KV模型。
    (3)set不允许插入重复数据,而multiset允许插入相同的数据。

    补充:multiset:multiset功能与set类似,接口也基本一样,最主要的区别是:set不允许数据冗余,而multiset允许数据冗余

    3 set里面的一些变量定义

    (1)set的模板参数介绍

    template < class T,                        // 表示set里面存放的数据类型
               class Compare = less<T>,        // 仿函数,可以指定让set按照什么方式进行比较数据
               class Alloc = allocator<T>     // 空间配置器,默认是系统提供的
             >

    (2)第二个模板参数Compare为仿函数,表示按照何种方式进行数据的比较,因为set进行遍历是有序的,当前仿函数的比较方式让set遍历的序列是递增的序列;如果想要让set遍历的序列为递减序列,就可以将第二个模板参数改为greater;另一方面如果set里面存放的是自定义类型,则必须自己实现一个仿函数用于支持两个自定义类型大小的比较。
    (3)第三个模板参数Alloc为空间配置器。

    4 set相关接口介绍

    4.1 插入数据(接口为insert)

    set的进行数据的插入有三种方式

    pair<iterator,bool> insert (const value_type& val);
    
    iterator insert (iterator position, const value_type& val);
    
    template <class InputIterator>   
    void insert (InputIterator first, InputIterator last);
    4.1.1 pair介绍:

    (1)pair是将2个数据组合成一个数据,当需要这样的需求时就可以使用pair,如stl中的map就是将key和value放在一起来保存。另一个应用是,当一个函数需要返回2个数据的时候,可以选择pair。 pair的实现是一个结构体,主要的两个成员变量是first second 因为是使用struct不是class,所以可以直接使用pair的成员变量。
    (2)pair的实现:

    template<class T1,class T2>
    struct pair
    {
        pair(T1 _first, T2 _second)
        :first(_first)
        , second(_second)
        {}
    
        T1 first;
        T2 second;
    };

    (3)将两个数据合成一个数据不仅可以使用pair创建对象的方式,还可以用make_pair,make_pair是一个模板函数。
    make_pair的实现:

    template<class T1,class T2>
    pair<T1, T2> make_pair(T1 first, T2 second)
    {
        return pair<T1, T2>(first, second);
    }
    4.1.2 插入方式介绍

    1.方式1:pair<iterator,bool> insert (const value_type& val);
    (1)返回一个pair,pair里面包含两种数据类型,一个是迭代器,一个是bool类型;
    (2)pair的第一个参数为该set的迭代器,表示如果插入一个set里面不存在的数据,则迭代器指向这个新增结点,如果插入一个set里面已经存在的数据,则迭代器指向已经存在的数据;
    (3)pair的第二个参数为bool类型,表示如果是true,则数据成功插入,如果为false则表示插入的数据已经存在。

    2.方式2:在某个位置上插入一个数据,iterator insert (iterator position, const value_type& val);

    3.方式3:将一个区间的数据插入

    template <class InputIterator>   
    void insert (InputIterator first, InputIterator last);

    InputIterator为迭代器的类型

    注意:multiset返回的都是新的数据(因为不论数据是否存在,都会成功插入除非内存已满,内存满也会抛异常)。

    4.2 set的遍历
    4.2.1 遍历方式介绍

    (1)用迭代器(默认是采用升序方式,如果采用反向迭代器或者将仿函数由默认less改成greater则可以输出降序的数据);
    ①正向迭代器

    set<int>::iterator it1 = s.begin();
    while (it1 != s.end())
    {
         cout << *it1 << " ";
         ++it1;
    }

    ②反向迭代器

    set<int>::reverse_iterator it1 = s.rbegin();
    while (it1 != s.rend())
    {
         cout << *it1 << " ";
         ++it1;
    }
    cout << endl;

    ③const迭代器(C++11里面);

    4.2.2 set进行遍历注意点

    (1)红黑树的遍历是走的中序,则s.begin()是红黑树的最左结点;
    (2)s.end()是最后一个数据的下一个位置;
    (3)++it1仍然是按照中序的方式(左根右);

    4.2.3 set删除数据(接口为erase)

    (1)删除某个位置:

    void erase (iterator position);
    s.erase(s.find(5));

    注意:如果利用该方式删除一个不存在的数据,应该要加判断,如:

    set<int>::iterator pos = s.find(10);
    if (pos != s.end())   //!=s.end()说明数据存在
    {
        s.erase(pos);
    }

    (2)删除某个值(相当于Remove)

    size_type erase (const value_type& val);
    set<int> s;
    s.insert(6);
    s.insert(5);
    s.insert(3);
    s.insert(7);
    s.insert(2);
    s.insert(1);
    
    set<int>::iterator it1 = s.begin();
    while (it1 != s.end())
    {
        cout << *it1 << " ";
        ++it1;
    }
        cout << endl;
        s.erase(3);
        it1 = s.begin();
        while (it1 != s.end())
        {
            cout << *it1 << " ";
            ++it1;
         }
    }

    注意:multiset删除某个值时,将里面与该值相等的所有数据全部删除。

    (3)删除某个区间:void erase (iterator first, iterator last);
    利用该方式删除的是一个左闭右开的区间;(即last表示最后一个删除数据的下一个位置);

    4.2.3 set查找数据(接口为find)
     iterator   find (const value_type& val)  const;
    4.2.4 count(统计数据是否存在于set里面)
    size_type    count (const value_type& val)   const;

    (1)返回值只有0或1;
    (2)如果返回1说明查找的数据存在,如果查找的数据不存在则返回零。
    注意:multiset的count返回该值出现的次数;

    4.2.5 swap

    (1)交换两个set,接口及参数如下:void swap (set& x);
    (2)底层是将两个set的根进行交换

    展开全文
  • STL-set

    千次阅读 2018-04-28 14:26:02
    【1】 set的底层结构为红黑树【2】 map和set的3个问题(1) 为什么map和set的插入和删除效率比其他容器高因为不需要内存拷贝和内存移动(2) 为何map和set每次insert之后,当前保存的iterator不会失效因为插入...
  • stl-views.gdb

    2016-01-23 17:24:49
    # The following STL containers are currently supported: # # std::vector<T> -- via pvector command # std::list<T> -- via plist or plist_member command # std::map,T> -- via pmap or pmap_member command #...
  • react-stl-file-viewer 安装 npm install --save react-stl-file... const [ photo , setphoto ] = useState ( '' ) const [ volume , setvolume ] = useState ( 0 ) function getFrame ( ) { let canvas = document
  • C++之STL-Set集合

    2021-08-17 11:28:01
    C++之STL-Set集合 set是关联式容器。set作为一个容器也是用来存储同一数据类型的数据类型,并且能从一个数据集合中取出数据,在set中每个元素的值都唯一,而且系统能根据元素的值自动进行排序。应该注意的是set中数...
  • set跟vector差不多,它跟vector的唯一区别就是,set里面的元素是有序的且唯一的,只要你往set里添加元素,它就会自动排序(升序),而且,如果你添加的元素set里面本来就存在,那么这次...c++ stl容器set成员函数:c...
  • STL-set (集合)之删除元素

    万次阅读 2016-11-10 21:25:52
    set概述 和vector、list不同,set、map都是关联式容器。set内部是基于红黑树实现的。插入和删除操作效率较高,因为只需要修改相关指针而不用进行数据的移动。  在进行数据删除操作后,迭代器会不会失效呢?删除...
  • stl-set

    2014-04-04 19:59:18
    set/multiset会根据待定的排序准则,自动将元素排序。两者不同在于前者不允许元素重复,而后者允许。 1) 不能直接改变元素值,因为那样会打乱原本正确的顺序,要改变元素值必须先删除旧元素,则插入新元素 2) 不提供...
  • STL-set-用法

    2015-10-05 20:35:01
    c++ stl容器set成员函数:begin()--返回指向第一个元素的迭代器 c++ stl容器set成员函数:clear()--清除所有元素 c++ stl容器set成员函数:count()--返回某个值元素的个数 c++ stl容器set成员函数:empty()--如果集合为...
  • STL--set_difference

    2019-09-29 20:00:42
    set_difference(),作用是求两个集合的差。即求A-B(属于A但不属于B的元素) set_difference()算法计算两个集合[start1, end1)和[start2, end2)的差集, 并将差集存放到result. 两个集合以序列的形式给出, 且必须先...
  • 代码其实很简单,我们只需要知道set类的使用方法就可以了,比如迭代器的定义( set&lt;T&gt;::iterator it=a.begin() ),和简单的insert函数插入,以及find函数找到时返回对应的迭代器,找不到时返回该set...
  • C++学习-STL-容器--SET保存重复值

    千次阅读 2019-08-16 14:53:44
    记录一下最近学习set时遇到的一些问题。 通常: 1、set中的元素都是排好序的 2、set集合中没有重复的元素 当我们用set来保存自定义类对象的时候,我们需要规定比较规则,就是重载less<>(),因为set要排序...
  • 我们可以使用set,将重定义运算符后的结构体添加到set中,让 他自动排序,跟新cnt可以先移除(未更新的)后添加(更新后的)。 题目代码: #include #include #include <set> using namespace std;...
  • STL--set multiset

    2016-10-26 19:55:13
    set用法
  • C++--STL---set容器

    2017-06-16 23:09:07
    Set 集合 ...C++ STL中标准关联容器set, multiset, map, multimap内部采用的就是一种非常高效的平衡检索二叉树:红黑树,即RB树(Red-Black Tree)。RB树的统计性能要好于一般平衡二叉树,所以被STL选择
  • STL-10 数据集

    千次阅读 2020-10-07 22:42:39
    The STL-10 dataset is an image recognition dataset for developing unsupervised feature learning, deep learning, self-taught learning algorithms. It is inspired by theCIFAR-10 datasetbut with some ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 67,424
精华内容 26,969
关键字:

stl-set