2015-09-16-容器
顺序容器
标准库的三种顺序容器为:vector,list,deque
。顺序容器的元素排列次序与元素值无关,而是由元素的添加顺序有关。
顺序容器
vector 支持快速随机访问
list 支持快速插入/删除
deque 双端队列
相应的适配器
stack LIFO
queue FIFO
priority_queue 有优先级管理的队列
容器元素初始化
C<T> c; //空容器
C<T> c(c2); //c2的容器副本c,c与c2必须具有相同的容器类型与相同类型的元素
C<T> c(b,e); //
C<T> c(n,t); //n个值为t的容器c
C<T> c(n); //
不相同的容器类型之间不能直接
将元素复制给彼此。但允许传递一对迭代器间接实现。需要注意指针也是迭代器。
vector<string> svec;
list<string> slist(svec.begin(),svec.end()); //C<T> c(b,e)
接受容器的大小做形参的构造函数只使用于顺序容器,关联容器不支持这种初始化。
容器内元素的类型约束
1.元素类型必须支持复制运算
2.元素类型必须可复制
C<T>
T为类时,若没有默认的构造函数,初始化时需要注意!
C<T> c; //ok
C<T> c(n); //error
....
容器的容器
C< C<T> > c; //> > not >>
迭代器及其范围
只有vector,deque慢做的运算:iter+n,iter-n,iter1+=iter2,iter1-=iter2,>,<,>=,<=。
C++使用一对迭代器标记迭代器的范围,[first,last)。
迭代器的操作
//插入元素
c.push_back(t)
c.push_front(t) //list,deque
c.insert(p,t)
c.insert(p,n,t)
c.insert(p,b,e) //p前插入
//访问元素
c.back()
c.front()
c[n] //vector,deque
c.at(n) //vector,deque
//删除元素
c.earse(p) //删除p指向的元素,并返回被删除元素后面的迭代器(指针)
c.earse(b,e)
c.clear()
c.pop_back()
c.pop_front() //list,deque
//赋值与swap
c1=c2
c1.swap(c2)
c.assign(b,e) //重新设置c的元素
c.assign(n,t)
vector容器的自增长
vector有size,capacity两种区别,size为vector的实际长度,capacity为vector的容器,size<=capacity,通常是小于。
关联容器
关联容器通过键(key)的存储来读取元素(value)。主要有map,set
两种类型,以及根据他们延伸的multimap,multiset
。
pair类型
pair<T1,T2> p;
pair<T1,T2> p(v1,v2);
make_pair<v1,v2> ;
p1 < p2
p1 == p2
p.first
p.second
map类型
map是key-value对集合。通过key来读取value。
1.构造函数
map<k,v> m;
map<k,v> m(m2);
map<k,v> m(b,e); //b,e为迭代器
2.map类定义的类型
map<k,v>::key_type //map中key的类型
map<k,v>::mapped_type //map中value的类型
map<k,v>::value_type //pair类型
3.给map添加元素
map<string,int> word_count;
word_count["Anna"] = 1; //使用“下标”访问,若不存在,则创建键为"Anna"的元素
//map::insert
m.insert(e)
m.insert(beg,end)
m.insert(iter,e)
使用小标的副作用是,当map中没有该键时,会插入一个具有该键的新元素。
3.查找并读取map中元素
m.count(k) //返回m中k出现的次数0或1
m.find(k) //返回元素,或返回超出末端的迭代器
4.删除元素
m.erase(k) //删除键为k的元素
m.erase(p) //删除迭代器p指向的元素
m.erase(b,e) //迭代器b到e之间的元素
5.map对象迭代遍历
还是begin,end迭代器。
set类型
版权声明:本文为博主原创文章,未经博主允许不得转载。