C++学习笔记汇总(五)

2014-11-24 08:28:23 · 作者: · 浏览: 4
中第一个值/key值大于val的迭代器
e) pairequal_range (const value_type& val) const;
pair equal_range (const value_type&val);
或者
pair equal_range (constkey_type& k) const;
pair equal_range (const key_type& k);
//返回容器中与传入值/key值相等的元素的范围,返回的是一个pair值,它的first值就是lower_bound,second值就是upper_bound
2.3.2 set
(1) 使用比较
内部数据结构为红黑树的平衡二叉检索树,按照键进行排序存储, 值必须可以进行比较, 可以理解为set就是键和值相等的map,不允许键值重复,元素默认按升序排列。此外,它所有的操作都可以在O(log n)时间复杂度内完成,效率非常高。
如果迭代器所指向的元素被删除,则该迭代器失效。其它任何增加、删除元素的操作都不会使迭代器失效。
2.3.3 multiset
(1) 使用比较
除了可以存储重复键值以外,其他情况和set相同。
2.3.4 map
(1) 使用比较
内部元素以<键,值>对的形式存储,键值不能重复,元素默认按键的升序排列。可以这样赋值一个对:m.insert(map::value_type(“count”, 100));,或者使用更为简单的数组下表符号“[]”。读取的时候,对于一个迭代器iter,可以这样指定:iter->first; iter->second,或者这样:*iter.first;*iter.second;。
如果迭代器所指向的元素被删除,则该迭代器失效。其它任何增加、删除元素的操作都不会使迭代器失效。
(2) 访问函数
a) mapped_type& operator[](const key_type& k);
mapped_type& operator[] (key_type&& k);
//就当他是数组这样用,但要注意,一旦使用了“[]”,如果此时没有对应的key值,将会产生一次插入操作
2.3.5 multimap
(1) 使用比较
除了可以使用重复键值,其他情况和map一样。
2.4 容器适配器
2.4.1 所有容器适配器共有函数
(1) 功能函数
a) boolempty ( ) const;
//如果适配器为空,则返回true,否则返回false
b) size_type size ( ) const;
//返回适配器中已有的元素数量
2.4.2 stack
(1) 使用比较
栈适配器,它可以将任意类型的序列容器转换为一个堆栈,一般使用deque作为支持的序列容器。元素只能后进先出(LIFO),不能遍历整个stack。
(2) 功能函数
a) value_type& top ( );
const value_type& top ( ) const;
//获取栈顶元素,并不弹出
b) void push ( const T& x );
//将元素压入栈
c) void pop ( );
//将栈顶元素弹出,并不返回
2.4.3 queue
(1) 使用比较
队列适配器,它可以将任意类型的序列容器转换为一个队列,一般使用deque作为支持的序列容器。元素只能先进先出(FIFO),不能遍历整个queue。
(2) 功能函数
a) value_type& front ( );
const value_type& front ( ) const;
//获取队列首部元素,并不弹出
b) value_type& back ( );
const value_type& back ( ) const;
//获取队列尾部元素,并不弹出
c) void push ( const T& x );
//添加新元素到队列中
d) void pop ( );
//将队首元素弹出,并不返回
2.4.4 priority_queue
(1) 使用比较
优先队列适配器,它可以将任意类型的序列容器转换为一个优先级队列,一般使用vector作为底层存储方式。只能访问第一个元素,不能遍历整个priority_queue,第一个元素始终是优先级最高的一个元素。
其内部数据结构是堆,具体使用上来说,对于一个结构体,如果想要做一个堆,可以在结构体内部或者外部重载符号“<”即可:
typedef struct Node{
……
bool operator<(const Node& in) const{
return data < in.data; //大根堆(如果应用于sort则是从小到大排序)
return data > in.data; //小根堆(如果应用于sort则是从大到小排序)
}
};
bool operator<(const Node& a, const Node& b){
return a.data < b.data; //大根堆(如果应用于sort则是从小到大排序)
return a.data >b.data; //小根堆(如果应用于sort则是从大到小排序)
}
但是如果想要同时构建最大堆以及最小堆,就需要传入定制的cmp结构:
typedef struct Job{ int prio;int age};
struct cmpBigHeap{ //建立大根堆(优先值高的队首)
bool operator()(const Job& a, const Job& b){ return a.prio< b.prio;}
};
struct cmpSmallHeap{ //建立小根堆(优先值低的在队首)
bool operator()(const Job& a, const Job& b){ return a.prio >b.prio;}
};
priority_queue, cmpBigHeap> bigHeap;
priority_queue, cmpSmallHeap > smallHeap;
(2) 功能函数
a) const value_type& top ( )const