容器-set和map

容器-set和map

set, multiset
set和multiset会根据特定的排序准则自动将元素排序,set中元素不允许重复,multiset可以重复。

因为是排序的,所以set中的元素不能被修改,只能删除后再添加。

向set中添加的元素类型必须重载<操作符用来排序。排序满足以下准则:
1、非对称,若A<B为真,则B<A为假。
2、可传递,若A<B,B<C,则A<C。
3、A<A永远为假。

set中判断元素是否相等:
if(!(A<B || B<A)),当A<B和B<A都为假时,它们相等。



map, multimap
map和multimap将key和value组成的pair作为元素,根据key的排序准则自动将元素排序,map中元素的key不允许重复,multimap可以重复。

因为是排序的,所以map中元素的key不能被修改,只能删除后再添加。key对应的value可以修改。

向map中添加的元素的key类型必须重载<操作符用来排序。排序与set规则一致。


初始化


class  A
{
public:
    
bool operator < (const A&const
    
{
        cout
<<"A::operator <"<<endl;
        
return false;
    }

}
;

// 自定义的函数对象
template < typename T >
class  FunObj
{
public:
    FunObj():status(
true){}
    FunObj(
int):status(false){}
    
bool operator ()(const T&const T&)
    
{
        cout
<<boolalpha<<status<<endl;
        
return status;
    }

private:
    
bool status;
}
;

int  main()
{
    
set<A>                sNone;                        //使用A类型的操作符<作为排序标准
    set<A, FunObj<A>>    sDefault;                    //使用函数对象作为排序标准,函数对象由默认构造函数构造
    set<A, FunObj<A>>    sSpecific((FunObj<A>(1)));    //使用函数对象作为排序标准,函数对象由指定构造函数构造

    sNone.insert(A());        
    sNone.insert(A());        
//call A::operator <

    sDefault.insert(A());
    sDefault.insert(A());    
//FunObj<A>::operator (), constructed by FunObj()

    sSpecific.insert(A());
    sSpecific.insert(A());    
//FunObj<A>::operator (), constructed by FunObj(int)

    
return 0;
}



添加、删除元素

     set < A >  si;
    pair
< set < A > ::iterator,  bool >  p  =  si.insert(A());             // 返回pair,第二个值表示是否插入成功
    cout << boolalpha << p.second << endl;

    
set < A > ::iterator it  =  si.insert(si.begin(), A());             // 从指定位置开始查找,返回新元素的位置,
    
    si.erase(A());                                                
// 删除值与参数相等的元素,返回删除元素个数
    si.erase(si.begin());                                         // 删除指定位置的元素,无返回值

    si.clear();                                                    
// 清空set

    
// map的insert对象是pair
    map < A, A >  m;
    A a,b;
    m.insert(map
< A,A > ::value_type(a,b));         // map<>::value_type()
    m.insert(pair < A,A > (a,b));                     // pair
    m.insert(make_pair(a,b));                     // make_pair()

其它操作
    cout << si.count( 4 ) << endl;                 // count返回值与指定参数相等的元素个数

    
set < int > ::iterator it  =  si.find( 3 );         // find返回第一个值与指定参数相等的位置,若没有,则返回end

    it 
=  si.lower_bound( 3 );                     // lower_bound返回第一个可以安插新元素的位置,即set中第一个>=新元素的位置
    it  =  si.upper_bound( 3 );                     // upper_bound返回最后一个可以安插新元素的位置,即set中第一个>新元素的位置
    pair < set < int > ::iterator,  set < int > ::iterator >  p 
        
=  si.equal_range( 3 );                 // equal_range返回set中元素与参数值相等的区间

你可能感兴趣的:(容器-set和map)