001顺序容器类型.
vector支持快速随机访问.
list支持快速插入删除.
deque双端队列.
顺序容器适配器.
stack后进先出栈LIFO.
queue先进先出栈FIFO.
priority_queue有优先级管理队列.
002顺序容器定义,所有容器都是模板,要定义具体容器,必须在容器名后加对尖括号,括号里提供容器存放元素类型.
#<vector>
#<list>
#<deque>
vector<>svec
list<>ilist
deque<Sales_item>items
003顺序容器构造
C<T>c创建个名为c空容器
Cc(c2)创建容器c2副本c,c和c2必须具有相同容器类型.
Cc(b,e)创建容器c,其元素是迭代器b和e标示范围内元素副本,e标示个停止指针,指向内容并不复制.
Cc(n,t)用n个t元素创建容器c,只适合顺序容器,不适合关联容器
Cc(n)创建n个值化元素容器c.只适合顺序容器,不适合关联容器
vector<>ivec[Page]
vector<>ivec2(ivec)//ok.
list<>ilist(ivec)//error,ivec是vector类型,而ilist是list类型.
vector<double>dvec(ivec)//error,容器内元素类型区别.
004将个容器复制给另个容器时,类型必须匹配:容器类型和元素类型都必须相同.
使用迭代器时,不要求容器类型相同,容器内元素类型也可以区别,只要它们互相兼容,能够将要复制元素转换为所构建新容器所构建元素类型.
采用这种方式可以复制不能直接复制容器,特别,可以复制另外容器个子序列.
list<>slist(svec.begin,svec.end)
vector<>::iteratormid=svec.begin+svec.size/2
deque<>front(svec.begin,mid)
deque<>back(mid,svec.end)
类似,可以通过内置指针来化个容器.
char*words={\"stately\",\"plump\",\"buck\",\"mulligan\"}
size_twords_size=(words)/(char*)
list<>wordsList(words,words+words_size)
化指定数目元素.
constlist<>::size_typelist_size=64
list<>slist2(list_size,\"heipio\")
list<>ilist2(list_size)
005容器元素限制:必须支持赋值运算,对象必须可以复制.引用类型不可以作为容器元素(不能赋值),标准输入输出不能作为容器元素.
如果类没有默认构造,那么在定义容器时候,必须定义空容器,或者提供显式构造参数.
假设Foo只有个需要个参数构造,那么: [Page]
vector<Foo>empty//ok
vector<Foo>bad(2)//error,无法默认创建元素,所以不行.
vector<Foo>fine(2,0)//ok,通过参数0,创建两个元素.
可以定义容器容器.
vector<vector<>>lines
lines.push_back(svec)
006常用迭代器运算.
*iter返回迭代器iter所指向元素引用.
iter->mem对iter解引用,获取指定元素中mem成员,等效于(*item).mem
iter/iter/--iter/iter--
iter1iter2比较两个迭代器是否指向同个元素(iter1!=iter2).
vector和deque容器额外运算.
iter+/-n
iter+/-=n
iter1-iter2
>,>=,<,<=
注意啦:在list容器中不支持\"+/-n\" *** 作,也不支持逻辑关系运算.
007使用迭代器编写时,必须留意那些使迭代器失效 *** 作,防止野指针问题.通常,要求涉及迭代器代码尽可能短小.
008容器定义类型.
size_type
iterator
const_iterator
reverse_iterator
const_reverse_iterator
dference_type
value_type元素类型. [Page]
reference元素引用类型value_type&
const_reference元素常量左值类型.
009容器begin和end *** 作,每个 *** 作还和容器是否为const有关.
c.begin/c.end
c.rbegin/c.rend
010容器中添加元素 *** 作
c.push_back(t)在末尾加t,返回void.
c.push_front(t)只适用于list和deque容器类型,返回void.
c.insert(p,t)在p前边插入t,返回指向新添加元素迭代器.
c.insert(p,n,t)在p前边插入n个t,返回void.
c.insert(p,b,e)在p前边插入迭代器b和e的间元素,返回void.
添加单个元素.
vector<>svec
list<>slist
spouse(\"Beth\")
//等同于slist.push_front(spouse).
slist.insert(slist.begin,spouse)
//vector没有push_front,但是可以采用在begin前插入方式实现该功能.
//要注意,对于vector容器,在前部或中间插入元素,是非常耗费资源个行为.
svec.insert(svec.begin,spouse)
//借用insert(p,t)返回值,循环向容器头部添加元素.
list<>::iteratoriter=slist.begin
while(cin>>spouse){ [Page]
iter=ilist.insert(iter,spouse)
}
插入段元素.
svec.insert(svec.end,ilist.begin,ilist.end)
sarr[4]={\"wangyi\",\"aichao\",\"master\",\"huawei\"}
svec.insert(svec.begin,sarr,sarr+4)
要注意,添加元素可能造成迭代器失效.比如在vector中添加元素,可能会导致整个容器重新加载,迭代器自然也就无效了.
因此不要保存begin或end *** 作返回值,而是每次使用时都要执行次该.
vector<>::iteratorfirst=v.begin
while(first!=v.end){
first=v.insert(first,42)
first
}
011关系 *** 作符.容器比较是基于容器内元素比较,如果元素不支持某种类型比较,容器也就不能做这种比较运算.
如果两个容器具有相同长度而且所有元素相等,那么两个元素就相等.
如果两个容器长度不相同,但较短容器中所有元素都等于较长容器中对应元素,则称较短容器小于另个容器.
如果两个容器都不是对方子序列,则它们比较结果取决于所比较第个不相等元素.
/*
ivec1:1357912
ivec2:024681012
ivec3:139
ivec4:1357
ivec5:1357912
*/ [Page]
ivec2<ivec1
ivec1<ivec3
ivec4<ivec1
ivec1ivec5
012容器大小 *** 作.
c.size
c.max_size返回类型是c::size_type.
c.empty
c.resize(n)如果n<c.size,则删除多出来元素,否则,添加值给新添加元素.
c.resize(n,t)新添加元素,都用t来化.resize *** 作可能会使迭代器失效.
013访问元素.如果容器非空,那么容器front和back成员将返回容器内第个和最后个元素\"引用\".
注意:返回是引用,begin和end返回是指针.
(!list.empty){
list<>::referenceval1=*ilist.begin
list<>::referenceval2=ilist.front
list<>::referencelast1=*--ilist.end
list<>::referencelast2=ilist.back
}
其他 *** 作.
c[n]这两个 *** 作,只适用于vector和deque容器.
c.at(n)如果给出下标无效,at会抛出out_of_range异常,所以推荐使用,最好还是用迭代器.
如果容器为空,那么所有访问容器 *** 作都是没有定义(也就是说只有鬼才知道会返回点什东西),导致出现严重.
014删除元素.
c.erase(p)删除迭代器p指向元素,返回被删除元素后边元素迭代器. [Page]
c.erase(b,e)删除迭代器b和e范围内元素,返回被删除段后面元素迭代器.
c.clear删除容内全部元素,返回void.
c.pop_back删除容器c最后个元素,返回void,c不能为空.
c.pop_front删除容器c第个元素,返回void,c不能为空,只适用于list或deque.
删除第个或者最后个元素,注意,pop_back和pop_front都是不返回值.
while(!ilist.empty){
//process(ilist.front)
ilist.pop_front
}
删除容器内个元素,要注意,erase是不检查迭代器参数是否有效.
searchValue(\"Quasimodo\")
list<>::iteratoriter=find(slist.begin,silist.end,searchValue)
(iter!=slist.end)
slist.erase(iter)
删除容器内所有元素.
slist.clear
slist.erase(slist.begin,slist.end)
015赋值和swap.除swap外,所有 *** 作,都可以用earse和insert取代.
c1=c2
c1.swap(c2)用c2容器元素取代c1容器元素.
c.assign(b,e)c中原来元素清空,将迭代器b和e标记范围内所有元素复制到c中.
c.assign(n,t)
带有对迭代器assin,允许我们将个容器元素赋给另个区别类型容器.
016容器capacity和reserve成员.
为了使vector容器实现快速内存分配,其实际分配容量要比当前所需空间多些.vector容器预留了这些额外存储区,用于存放新添加元素. [Page]
于是,不必为每个新元素重新分配空间,所以,比起list和deque容器,vector增长效率要高些.
vector<>ivec
cout<<\"ivec::size\"<<ivec.size<<\"capacity:\"<<ivec.capacity<<endl
for(vector<>::size_typeix=0ix!=24ix)
ivec.push_back(ix)
cout<<\"ivec::size\"<<ivec.size<<\"capacity:\"<<ivec.capacity<<endl
ivec.reserve(50)
cout<<\"ivec::size\"<<ivec.size<<\"capacity:\"<<ivec.capacity<<endl
while(ivec.size!=ivec.capacity)
ivec.push_back(0)
cout<<\"ivec::size\"<<ivec.size<<\"capacity:\"<<ivec.capacity<<endl
ivec.push_back(50)
cout<<\"ivec::size\"<<ivec.size<<\"capacity:\"<<ivec.capacity<<endl
017容器选用.
如果无法确定应该采用哪种容器,则编写代码时尝试只使用vector和list容器都提供 *** 作(使用迭代器,而不是下标),并且避免随机访问元素.
这样编写代码,在必要时,可很方便将从使用vector容器修改为使用list容器.
018容器适配器.
#<stack>
#<queue>
默认stack和queue都是基于deque容器实现,而priority_queue则是在vector容器上实现,如果要改变默认类型: [Page]
stack<,vector<>>str_stack
priority_queue<,list<>>ipr_queue
019适配器通用类型和 *** 作.
size_type
value_type
container_type
Aa
Aa(c)
关系 *** 作
020栈适配器 *** 作.
s.empty
s.size
s.pop//删除栈顶元素,但不返回其值.
s.top//返回斩定元素,但不删除其值.
s.push(item)//将item压如栈顶.
//09020.cpp
#<stack>
#<iostream>
usingstd::stack
usingstd::cout
usingstd::cerr
usingstd::endl
...{
conststack<>::size_typestk_size=10
stack<>Stack
ix=0
while(Stack.size!=stk_size)...{
Stack.push(ix)
}
error_cnt=0[Page]
while(!Stack.empty)...{
value=Stack.top
(value!=--ix)...{
cerr<<\"oops!expected\"<<ix<<\"received\"<<value<<endl
error_cnt
}
cout<<value<<\"\"
Stack.pop
}
cout<<endl
cout<<\"Ourprogramranwith\"<<error_cnt<<\"errors!\"<<endl
0
}
021队列和优先级队列支持 *** 作.
q.empty
q.size
q.pop
q.front返回队首元素,但不删除该元素,只适用于队列.
q.back返回队尾元素,但不删除该元素,只适用于队列.
q.top返回具有最高优先级元素,但不删除该元素,只适合优先级队列.
q.push(item)对于队列,在队尾压如个新元素,对于优先级队列,在适当位置插入新元素.
可以这么考虑:开始3molA和1molB形成平衡时C的浓度为w mol/L,后来加的3molA,1molB如果单独在另一个一样的容器中的话,最后C的浓度也为w mol/L,现在将两个容器压成一个,瞬间C的浓度变为2w mol/L,由于压强增大,平衡会向右移动(气体体积缩小的反应移动),所以C(C)>2wmol/L欢迎分享,转载请注明来源:内存溢出
评论列表(0条)