设为首页 加入收藏

TOP

C ++标准库容器总结(二)
2013-01-01 14:50:20 来源: 作者: 【 】 浏览:524
Tags: 标准 容器 总结

 

    顺序容器适配器:stack(栈),queue(队列),priority_queue(优先级队列).

    a)容器适配器通用的操作和类型:

    size_type 一种类型,存储此适配器类型最大对象的长度;

    value_type 元素类型;

    container_type 基础容器的类型;

    A a;创建一个新的容器适配器;

    A a(c);创建一个新的容器适配器a,初始化为c的副本;

    关系操作符:==,!=,<,<=,>,>=.

    b)适配器的初始化:

    deque<int> deq;

    stack<int> stk();

    stack<int> stk(deq);

    注:*stack适配器和queue适配器的基础容器默认为deque,priority_queue的基础容器默认为vector.

    c)覆盖基础容器类型:

    deque<int> deq;

    stack<int,vector<int> > stk(deq);

    注:*stack适配器关联的基础容器可以是任意一种顺序容器类型;

    *queue适配器要求基础容器必须提供push_front操作,只能建立在list容器上;

    *priority_queue适配器要求提供随机访问操作,只能建立在vector或deque容器上;

    d)栈适配器的操作:

    s.empty();返回栈是否为空;

    s.size();返回栈中的元素个数;

    s.pop();删除栈顶元素,返回void;

    s.top();返回栈顶元素,但不删除该元素;

    s.push(item);在栈顶压入新元素;

    注:*程序员不能直接使用栈适配器所关联的基础容器的操作.

    e)队列和优先级队列的操作:

    q.empty();返回队列是否为空;

    q.size();返回队列中的元素个数;

    q.pop();删除队首元素,返回void;

    q.front();返回队首元素,但不删除元素,只适用于队列;

    q.back();返回队尾元素,但不删除元素,只适用于队列;

    q.top();返回具有最高优先级的元素,但不删除该元素,只适用于优先级队列;

    q.push(item);对于queue,在队尾压入一个元素;对于priority_queue,在基于优先级的适当位置插入一个元素.

    1 关联容器定义

    存储对象集合的类型,支持通过键的高效访问.和顺序容器的本质差别在于:顺序容器通过元素在容器中的位置顺序存储和访问元素,而关联容器却是依靠键.map和set是两个基本的关联容器类型,map以键值对的形式组织存储元素,而set仅存储键.

    2 pair类型(在utility头文件中定义)

    a)pair类型的操作:

    pair<T1,T2> p1;创建一个空的pair对象,两个元素类型分别是T1和T2,值初始化;

    pair<T1,T2> p1(v1,v2);创建一个pair对象,具有两个元素v1和v2,类型分别是T1和T2;

    make_pair(v1,v2);以v1和v2作为值创建一个pair对象,元素类型分别是v1和v2的类型;

    p1.first;返回值为v1;

    p1.second;返回值为v2;

    p1 < p2;小于运算遵循字典次序;

    p1 == p2;如果两个pair对象的first成员和second成员依次相等,则两个pair对象相等;

    注:*pair类型属于类模板.

    3 关联容器和顺序容器的操作区别

    a)共有的操作:

    C<T> c;

    C<T> c(c2);

    C<T> c(b,e);

    关系操作符;

    c.begin();

    c.end();

    c.rbegin();

    c.rend();

    size_type

    iterator

    const_iterator

    reverse_iterator

    const_reverse_iterator

    difference_type 存储两个迭代器差值的有符号整型,可为负数

    value_type 对于map,是pair 类型

    reference value_type& 的同义词

    const_reference 等效于 const value_type&

    swap和赋值操作;

    clear和erase操作;

    容器大小的操作(resize除外);

    b)关联容器不提供的操作:

    front,push_front,pop_front,back,push_back,pop_back

    4 map类型

    map类型可理解为关联数组,关联的本质在于元素的值与某个特定的键相关联,而与元素的位置无关.

    a)map对象的定义:

    map<k,v> m;创建一个空的map对象m,其键和值的类型分别为k,v;

    map<k,v> m(m2);创建m2的副本m,m必须具有和m2相同的键类型和值类型;

    map<k,v> m(b,e);创建一个map对象m,存储迭代器[b,e)标记范围内的所有元素的副本,元素类型必须能转换为pair<const k,v>;

    注:*键类型必须能够定义<操作符.

    b)map定义的类型:

    map<k,v>::key_type;键的类型

    map<k,v>::mapped_type;元素的类型

    map<k,v>::value_type;pair<const map<k,v>::key_type,map<k,v>::mapped_type>

    注:*map迭代器解引用生成pair<const map<k,v>::key_type,map<k,v>::mapped_type>类型的对象,pair对象的值成员可以修改,但键成员不能修改;

    5 map容器的操作

    a)添加元素:

    m.insert(e);e为map的value_type类型的值.如果键e.first不存在,则添加一个值为e.second的值,如果存在,则m不变.该操作返回一个pair类型的对象,包含一个指向新添加元素的map迭代器,以及一个bool值,表示插入是否成功;

    m.insert(b,e);将迭代器b和e标示区间内的所有元素插入到m中,所插入的元素必须为m.value_typpe类型,返回void;

    m.insert(iter,e);如果m中不存在键e.first,则在m中以iter为起点搜索新元素的位置并插入,返回一个指向新添加元素的迭代器.

    m[“zhu”] = 1;在map中查找键为“zhu”的元素,如果没有,则插入一个新的键值对,键为“zhu”,值采用初始化,再将1赋给元素的值;

    b)查询元素:

    m.count(k);返回m中k键出现的次数,返回值只能是0或1;

    m.find(k);如果m中存在键为k的元素,则返回指向该元素的迭代器,否则,返回m.end();

    c)删除元素:

    m.erase(k);删除m中键为k的元素,返回值为所删除元素的个数,只能是0或1,类型为size_type;

    m.erase(p);删除m中迭代器p所指向的元素,p所指向的元素必须存在,返回void;

    m.erase(b,e);删除m中由迭代器[b,e)标示范围内的元素,[b,e)必须是有效范围,返回void.

    6 set类型

    set容器单单存储键的集合.

    a)set容器不支持的操作:

    set不支持下标操作;

    没有定义mapped_type,value_type对应的是key_type,即元素的类型;

    与map一样,set容器中的键也必须唯一,而且不能修改.

    注:*set容器支持map的大部分的操作.

    7 multimap和multiset

    a)元素的添加删除:

    insert 操作每次都会添加一个元素;

    erase 带有一个键参数的该操作将删除拥有该键的所有元素,返回删除的元素个数,而带有一个或一对迭代器参数,则只删除指定的元素,返回void.

    b)查找元素:

    m.count,m.find()

    m.lower_bound(k) 返回一个指向键不小于k的元素的迭代器;

    m.upper_bound(k) 返回一个指向键大于k的第一个元素的迭代器;

    m.equal_range(k) 返回一个pair对象,first成员等价于m.lower_bound(k);second成员等价于m.upper_bound(k);

    注:*三种查找方法都基于一个事实,在multimap中,同一个键所关联的元素必然相邻存放.

      

首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇静态的声明一个指针变量 下一篇动态数组的使用

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: