ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

C++提高编程 3 STL常用容器 -set/multiset容器

2022-02-26 01:31:07  阅读:166  来源: 互联网

标签:容器 set 20 insert STL s1 30 10


3.8  set/multiset容器

3.8.1  set基本概念

简介:所有元素都会在插入时自动被排序

本质:set/multiset属于关联式容器,底层结构是用二叉树实现

set和multiset区别:

set不允许容器中有重复的元素

multiset允许容器中有重复元素

 

3.8.2  set构造与赋值

功能描述:创建set容器以及赋值

 构造:

set<T> st;  //默认构造函数

set(const set &st);  //拷贝构造函数

赋值:

set& operator=(const set &st);//重载等号操作符

 

set:

#include<iostream>
#include<set>
using namespace std;
#include<string>
//set容器构造和赋值

void printSet(set<int>&s)
{
    for (set<int>::iterator it = s.begin(); it != s.end(); it++)
    {
        cout << *it << " ";
    }
    cout << endl;
}


void test1()
{
    set<int>s1;

    //插入数据只有insert方式
    s1.insert(30);
    s1.insert(10);
    s1.insert(40);
    s1.insert(20);
    s1.insert(30);
    
    //遍历容器
    //set特点:1、所有元素再插入的时候会自动排序  2、不允许插入重复值
    printSet(s1);        //10 20 30 40

    //拷贝构造
    set<int>s2(s1);
    printSet(s2);    //10 20 30 40

    //赋值
    set<int>s3;
    s3 = s2;
    printSet(s3);    //10 20 30 40
}

int main()
{
    test1();
    
    system("pause");
    return 0;
}

 

multiset:

#include<iostream>
#include<set>
using namespace std;
#include<string>
//multiset容器构造和赋值

void printmultiSet(multiset<int>&s)
{
    for (multiset<int>::iterator it = s.begin(); it != s.end(); it++)
    {
        cout << *it << " ";
    }
    cout << endl;
}

void test1()
{
    multiset<int>s1;

    //插入数据只有insert方式
    s1.insert(30);
    s1.insert(10);
    s1.insert(40);
    s1.insert(20);
    s1.insert(30);
    
    //遍历容器
    //set特点:1、所有元素再插入的时候会自动排序  2、不允许插入重复值
    printmultiSet(s1);        //10 20 30 30 40

    //拷贝构造
    multiset<int>s2(s1);
    printmultiSet(s2);        //10 20 30 30 40

    //赋值
    multiset<int>s3;
    s3 = s2;
    printmultiSet(s3);        //10 20 30 30 40
}

int main()
{
    test1();
    
    system("pause");
    return 0;
}

 

3.8.3  set大小和交换

功能描述:
统计set容器大小以及交换set容器

函数原型:

size();    //返回容器中元素个数

empty();    //判断容器是否为空

swap();    //交换两个集合容器

#include<iostream>
#include<set>
using namespace std;

//set容器大小和交换

void printSet(set<int>&s)
{
    for (set<int>::iterator it = s.begin(); it != s.end(); it++)
    {
        cout << *it << " ";
    }
    cout << endl;
}

//大小
void test1()
{
    set<int>s1;

    s1.insert(10);
    s1.insert(40);
    s1.insert(20);
    s1.insert(30);
    
    if (s1.empty())
    {
        cout << "set s1容器为空" << endl;
    }
    else
    {
        cout << "set s1容器不为空" << endl;
        printSet(s1);                                        //10 20 30 40
        cout << "s1的大小为:" << s1.size() << endl;        //s1的大小为:4
    }
}

//交换
void test2()
{
    set<int>s1;
    s1.insert(10);
    s1.insert(40);
    s1.insert(20);
    s1.insert(30);

    set<int>s2;
    s2.insert(50);
    s2.insert(70);
    s2.insert(60);
    s2.insert(80);

    cout << "交换前:" << endl;
    printSet(s1);        //10 20 30 40
    printSet(s2);        //50 60 70 80

    cout << "交换后:" << endl;
    s1.swap(s2);
    printSet(s1);        //50 60 70 80
    printSet(s2);        //10 20 30 40
}

int main()
{
    test1();
    test2();
    system("pause");
    return 0;
}

 

3.8.4  set插入和删除

功能描述:set容器进行插入数据和删除数据

函数原型:

insert(elem);      //在容器中插入元素

clear();        //清除所有元素

erase(pos);      //删除pos迭代器所指的元素,返回下一个元素的迭代器

erase(beg,end);   //删除区间[beg,end)的所有元素,返回下一个元素的迭代器

erase(elem);     //删除容器中值为elem的元素

#include<iostream>
using namespace std;
#include<set>

//set容器 插入与删除

void printSet(set<int>& s)
{
    for (set<int>::iterator it = s.begin(); it != s.end(); it++)
    {
        cout << *it << " ";
    }
    cout << endl;
}

void test1()
{
    set<int>s;

    //插入
    s.insert(20);
    s.insert(10);
    s.insert(30);
    s.insert(50);
    s.insert(40);
    printSet(s);            //10 20 30 40 50

    //删除
    s.erase(s.begin());
    printSet(s);            //20 30 40 50

    s.erase(30);            
    printSet(s);            //20 40 50

    s.erase(s.begin(),s.end());
    printSet(s);            //打印一行空白

    s.clear();
    printSet(s);            //打印一行空白
}

int main()
{
    test1();

    system("pause");
    return 0;
}

 

3.8.5  set查找与统计

功能描述:对set容器进行查找数据以及统计数据

函数原型:

find(key);    //查找key是否存在,若存在,返回该键的迭代器;若不存在,返回set.end(); 

count(key);   //统计key的元素个数  //对set而言,统计元素的个数的结果,要么是0,要么是1。但multiset可以统计真实个数

set:

#include<iostream>
using namespace std;
#include<set>

//set容器 插入与删除

void printSet(set<int>& s)
{
    for (set<int>::iterator it = s.begin(); it != s.end(); it++)
    {
        cout << *it << " ";
    }
    cout << endl;
}

void test1()
{
    set<int>s;

    //插入
    s.insert(30);
    s.insert(20);
    s.insert(30);
    s.insert(10);
    s.insert(30);
    s.insert(50);
    s.insert(30);
    s.insert(40);
    s.insert(30);
    printSet(s);            //10 20 30 40 50

    //cout << "set容器中30的数量:" << s.find(30) << endl;        //想法错了
    set<int>::iterator pos = s.find(50);
    if (pos != s.end())
    {
        cout << "找到元素:" << *pos << endl;
    }
    else
    { 
        cout << "未找到元素!" << endl;
    }
}

//统计
void test2()
{
    set<int>s;

    //插入
    s.insert(30);
    s.insert(20);
    s.insert(30);
    s.insert(10);
    s.insert(30);
    s.insert(50);
    s.insert(30);
    s.insert(40);
    s.insert(30);
    printSet(s);            //10 20 30 40 50

    int num = s.count(30);    //对set而言,统计元素的个数的结果,要么是0,要么是1
    cout << "所要统计的元素个数为:" << num << endl;        //num = 1
}

int main()
{
    test1();
    test2();
    system("pause");
    return 0;
}

 

multiset:

#include<iostream>
using namespace std;
#include<set>

//multiset容器 插入与删除

void printMultiet(multiset<int>& s)
{
    for (multiset<int>::iterator it = s.begin(); it != s.end(); it++)
    {
        cout << *it << " ";
    }
    cout << endl;
}

void test1()
{
    multiset<int>s;

    //插入
    s.insert(30);
    s.insert(20);
    s.insert(30);
    s.insert(10);
    s.insert(30);
    s.insert(50);
    s.insert(30);
    s.insert(40);
    s.insert(30);
    printMultiet(s);            //10 20 30 30 30 30 30 40 50

    //cout << "set容器中30的数量:" << s.find(30) << endl;        //想法错了
    multiset<int>::iterator pos = s.find(50);
    if (pos != s.end())
    {
        cout << "找到元素:" << *pos << endl;
    }
    else
    { 
        cout << "未找到元素!" << endl;
    }
}

//统计
void test2()
{
    multiset<int>s;

    //插入
    s.insert(30);
    s.insert(20);
    s.insert(30);
    s.insert(10);
    s.insert(30);
    s.insert(50);
    s.insert(30);
    s.insert(40);
    s.insert(30);
    printMultiet(s);            //10 20 30 30 30 30 30 40 50

    int num = s.count(30);    //对multiset而言,统计元素的个数的结果是真实的个数
    cout << "所要统计的元素个数为:" << num << endl;        //num = 5
}

int main()
{
    test1();
    test2();
    system("pause");
    return 0;
}

 

3.8.6  set和multiset区别

区别:

1、set不可以插入重复数据,而multiset可以;

2、set插入数据的同时会返回插入结果,表示插入是否成功

3、multiset不会检测数据,因此可以插入重复数据

总结:如果不允许插入重复数据就用set,如果需要插入重复的数据就要用multiset;

#include<iostream>
using namespace std;
#include<set>

//set容器与multiset容器区别

void printSet(set<int>& s)
{
    for (set<int>::iterator it = s.begin(); it != s.end(); it++)
    {
        cout << *it << " ";
    }
    cout << endl;
}

void test1()
{
    set<int>s;            //不允许插入重复值

    pair<set<int>::iterator, bool>ret = s.insert(10);
    if (ret.second)        //ret的第二个参数 即bool为真,表示插入成功
    {
        cout << "第1次插入成功!" << endl;            //第1次插入成功!
    }
    else
    {
        cout << "第1次插入失败!" << endl;
    }
    
    ret = s.insert(10);    //再插一次10
    if (ret.second)
    {
        cout << "第2次插入成功!" << endl;
    }
    else
    {
        cout << "第2次插入失败!" << endl;            //第2次插入失败!
    }

    multiset<int>ms;    //允许插入重复值
    ms.insert(10);
    ms.insert(10);
    ms.insert(10);
    ms.insert(10);

    for (multiset<int>::iterator it = ms.begin(); it != ms.end(); it++)
    {
        cout << *it << " ";                //10 10 10 10
    }
    cout << endl;
}

int main()
{
    test1();
    
    system("pause");
    return 0;
}

 

标签:容器,set,20,insert,STL,s1,30,10
来源: https://www.cnblogs.com/kelin1122/p/15937244.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有