当前位置:编程学习 > C/C++ >>

C++ 获取容器指示器

C++ 获取容器指示器的函数中:

begin()->rend为什么不能等同于end()->begin()

能不能说的详细点,谢谢~

答案:

顺序容器是个需要掌握地方也是个很重要知识点下面整理总结下它基础使用思路方法考试学习都用上( 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=0;ix!=24;ix)
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

上一个:简单c++函数问题
下一个:C和C++有什么

CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,