无中生有之突击NOIP(特刊)突击学习总结1

1.SET

高中我们就早已学习过set(集合),我们也已经熟知集合的定义,可以存放不相同的元素,记住是不相同的,而set是C++中的STL里很重要的一部分。我们可以使用许多简易的常用操作如:插入,排序,删除,查找等,让用户在STL使用过程中并不会感到陌生。
set,必须说明的是set关联式容器,set作为一个容器也是用来存储同一数据类型的数据类型,并且能从一个数据集合中取出数据,在set中每一个元素的值都唯一,而且系统能根据元素的值自动进行排序。应该注意的是set中数元素的值不能被直接改变。C++STL中标准关联容器set,multiset,map,multimap内部采用的就是一种非常高效的平衡检索二叉树:红黑树,也成为RB树。RB树的统计性能要好于一般平衡二叉树,所以被STL选择作为了关联容器的内部结构。而且,set的插入和搜索速度非常快,所以你可以安心向里面放入元素的。

    set中常用的方法

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

#include<iostream>
#include<set>

using namespace std;
int main()
{
    set<int> a;
    s.insert(1);
    s.insert(2);
    s.insert(3);
    s.insert(1);
    cout<<"set的size值为:"<<s.size()<<endl;
    cout<<"set的maxsize的值位:"<<s.max_size()<<endl;
    cout<<"set的最后一个元素是:"<<*s.begin()<,endl;
    cout<<"set中的最后一个元素:"<<*s.end()<<endl;
    s.clear();
    if(s.empty())
    {
        cout<<"set为空<<endl;
    }
    cout<<"set的size值位:"<<s.size()<<endl;
    cout<<"set的maxsize的值为:"<<s.max_size()<<endl;
    return 0;
}

注意结果插入了一个1后,但是我们发现set中最后一个值仍然是3哈,这就是set。还要注意begin()和end()函数是不检查set是否为空的,所以还是要依靠empty。

2.count()用来查找set中某个键值出现的次数。这个函数在set并不是很实用,因为一个键值在set只可能出现0次或者1次,这样就变成了判断某一键值是否在set中出现过了。s.count(1)即为s中1出现的次数。

3.equal_range()返回一对定位器,分别表示第一个大于或等于给定关键值的元素和第一个大于给定关键值的元素,这个返回值是一个pair类型,如果这一对定位器中哪个返回失败,就会等于end()的值,具体这个有什么用途?不懂

#include<iostream>
#include<set>
using namespace std;
int main()
{
    set<int> s;
    set<int>::iterator iter;
    for(int i=1;i<=5;i++)
    {
        s.insert(i);
    }
    for(iter=s.begin();iter!=s.end();++iter)
    {
        cout<<*iter<<" ";
    }
    cout<<endl;
    pair<set<int>::const_iterator,set<int>::const_iterator>pr;
    pr=s.equal_range(3);
    cout<<"第一个大于等于3的数是:"<<*pr.first<<endl;
    cout<<"第一个大于3的数是:"<<*pr.second<<endl;
    return 0;
}

4.erase(iterator)删除定位器iterator指向的值
erase(first_second)删除定位器first和second之间的值
erase(key_value),删除键值key_value的值
程序

#include<iostream>
#include<set>;
using namespace std;
int main()
{
    set<int> a;
    set<int>::const_iterator iter;
    set<int>::iterator first;
    set<int>::iterator second;
    for(int i=1;i<=10;i++)
    {
        s.insert(i);
    }
    //第一种删除
    s.erase(s.begin());
    //第二种删除
    first=s.beign();
    secoud=s.begin();
    second++;
    second++;
    s.erase(first,second);
    //第三种删除
    s.erase(8);
    cout<<"删除后set中元素是:";
    for(iter = s.begin();iter!=s.end();++iter)
    {
        cout<<*iter<<" ";
    }
    cout<<endl;
    return 0;
}

小结:set中删除操作是不进行任何错误检查的,比如定位器是否合法等等,所以用的时候一定要注意

5.find(),返回给定值的定位器,如果没找到则返回end()。

#include<iostream>
#include<set>

using namespace std;
int main()
{
    int a[]={1,2,3};
    set<int> s(a,a+3);
    set<int>::iterator iter;
    if((iter=s.find(2)) != s.end());
    {
        cout<<*iter<<endl;
    }
    return 0;
}

6.insert(key_value);将key_value插入到set中,返回值是pair

#include<iostream>
#include<set>
using namespace std;
int main()
{
    int a[]={1,2,3};
    set<int>a';
    set<int>::iterator iter;
    s.insert(a,a+3);
    for(iter=s.begin(); iter != s.end();++iter)
    {
        cout<<*iter<<" ";
    }
    cout<<endl;
    pair<set<int>::iterator,bool>pr;
    pr = a.insert(5);
    if(pr.second)
    {
        cout<<*pr.first<<endl;
    }
    return 0;
}

7.lower_bound(key_value),返回第一个大于等于key_value的定位器
upper——bound(key_value),返回最后一个大于等于key_value的定位器

#include <iostream>
#include <set>

using namespace std;

int main()
{
    set<int> s;
    s.insert(1);
    s.insert(3);
    s.insert(4);
    cout<<*s.lower_bound(2)<<endl;
    cout<<*s.lower_bound(3)<<endl;
    cout<<*s.upper_bound(3)<<endl;
    return 0;
}

最后总结一下:
Setse;定义
Se.insert();插入一个值
Se.find();查找一个值
Se.erase();删除(1.迭代器所指的值2.从一个迭代器到另一个迭代器之间的值3.某个值)
begin();//返回set容器的第一个元素
end()//返回set容器的最后一个元素
clear()//删除set容器中的所有的元素
empty()//判断set容器是否为空
max_size()//返回set容器可能包含的元素最大个数
size()//返回当前set容器中的元素个数
rbegin//返回的值和end()相同
rend()//返回的值和rbegin()相同
count() //用来查找set中某个某个键值出现的次数。
//这个函数在set并不是很实用,因为一个键值
//在set只可能出现0或1次,这样就变成了判断
//某一键值是否在set出现过了。

二、map

Map是C++的一个标准容器,它提供了很好一对一的关系,换言之这是一个非常简易且便于理解的数组,下面也顺便总结一下map的基本简单实用的操作

1.map最基本的构造函数
map

map<int,string>::iterator l_it;
l_it=maplive.find(1);
if(l_it==maplive.end())
cout<<"Fuck you shit!!"<<endl;
else cout<<"Bitch!"<<endl;

4.map中元素的删除
如果要删除1609:
利用erase()括号内填迭代器

map<int,string>::iterator l_it;
l_it=maplive.find(1609);
if(l_it=maolive.end())
    cout<<"we can't do it!"<<endl;
else maplive.earse(l_it);//delete

5.map中swao的用法:
Map中的swap不是一个容器中的元素交换,而是两个容器交换;

#include<map>
#include<iostream>
using namespace std;
int main()
{
    map<int,int >m1.m2,m3;
    map<int,int>::iterator m1_iter;
    m1.insert( pair<int,int>(1,10));
    m1.insert( pair<int,int>(2,20));
    m1.insert( pair<int,int>(3,30));
    m2.insert( pair<int,int>(10,100));
    m2.insert( pair<int,int>(20,200));
    m3.insert( pair<int,int>(30,300));
cout<<"the original map m1 is:";
for( m1_Iter = m1.begin();m_Iter !=m1.end();m1_Iter++)
    cout<<" "<<m1_Iter->second;
    cout<<"."<<endl; 
cout<<"After swapping with m2,map m1 is:";
for(m1_Iter=m2.begin();m1_Iter!=m2.end();m1_Iter++)
    cout<<" "<<m1_Iter->second;
    cout<<"."<<endl;
cout<<"After swapping with m2 ,map m1 is:";
for(m1_Iter = m1.begin();m1_Iter!=m1.end();m1_Iter++)
    cout<<" "<<m1_Iter->second;
    cout<<"."<<endl;
}

6.map的sort问题:
Map中元素是自动按照key升序排列,所以不能对map用sort函数;
For example;

#include<map>
#include<iostream>
using namespace std;
int main()
{
    map<int,int>m1;
    map>int,int>::iterator m1_Iter;
    m1.insert(pair<int,int> (1,20));
    m1.insert(pair<int,int> (4,40));
    m1.insert(pair<int,int> (3,60));
    m1.insert(pair<int,int> (2,50));
    m1.insert(pair<int,int> (6,40));
    m1.insert(pair<int,int> (7,30));
    cout<<"The original map m1 is:"<<endl;
    for(m1_Iter=m1.begin();m1_Iter!=m1.end();m1_Iter++)
        cout<< m1_Iter->first<<" "<<m1_Iter->second<<endl;
}

7、map的基本操作函数:
C++Maps是一种关联式容器,包含“关键字/值”
begin() 返回指向map头部的迭代器
clear() 删除所有元素
count() 返回指定元素出现的次数
empty() 如果map为空则返回true
end() 返回指向map尾部的迭代器
equal_range() 返回特殊条目的迭代器对
erase() 删除一个元素
find() 查找一个元素
get_allocator() 返回map的配置器
insert() 插入元素
key_comp() 返回比较元素key的函数
lower_bound() 返回键值>=给定元素的第一个位置
max_size() 返回可以容纳的最大的元素个数
rbegin() 返回一个可以指向map尾部的逆向迭代器
rend() 返回一个指向map头部的逆向迭代器
size() 返回map中元素个数
swap() 交换两个map
upper_bound() 返回键值>给定元素的第一个位置
value_comp() 返回比较元素value的函数

不开心的我,不想写自述,就把前几天朋友送给我的话抄上吧
海底月是天上月,眼前人是心上人。:)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值