C++ 获取容器指示器

C++ 获取容器指示器,第1张

顺序容器是个需要掌握地方也是个很重要知识点下面整理总结下它基础使用思路方法考试学习都用上( www.)

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


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11921437.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-19
下一篇 2023-05-19

发表评论

登录后才能评论

评论列表(0条)

保存