分享
 
 
 

STL 之 Container Concepts

王朝other·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

Container:

描述:存放各种元素,每个Container必须要有相应的Iterator,元素的存放顺序不定。

也许每次Iterator遍历Container的时候,每次的访问顺序都可能不一样,而且Container

不能保证在同一时刻有超过一个Iterator有效。Container自己拥有包含的元素(如果是指

针Container,那么就仅仅是对指针游泳所有权,而不是指针指向的对象)。Container可以

根据是否可以动态的改变容器大小分为Fixed Sized Container 和 Variable Sized Con

tainer.

定义:Container的Size是指包含的元素的个数,非负。

Container的Area是指该Container所占据的字节数。等于所有的元素占有的空间

+Container附加的空间消耗。

表达式语义:

1、x,y表示Container中元素对象。

表达式包括赋值 x=y,判等x==y,x!=y,比较大小x<y,x<=y,x>y,x>=y.

2、a,b表示Container对象。表达式包括构造函数,析够函数,拷贝构造函数,赋值运

算符、begin(),end(),size(),max_size(),empty(),swap()。

b=a ,把容器a拷贝给b,因此a,b的大小也就一致。

a.begin(),返回一个指向容器的第一个元素的Iterator

a.end() , 返回一个指向容器的最后一个元素的Iterator

a.size() ,返回容器a的元素个数

a.max_size(),返回容器a可能达到的最大的元素个数,在Fixed Sized Contain

er里面size()==max_size()

a.empty() ,判断容器a是否为空

Forward Container:

描述:Forward Container首先是Container,和Container区别的是他的元素存放顺序是

一定的,他的Iterator必定是Forward Iterator,因为他自己是一个Forward Container,I

terator遍历的时候每次的顺序都必定一样。

表达式语义:a,b表示Container对象。首先他包含Container的表达式,另外还有:a<

b,a==b。

a<b: 相当于lexicographical_compare(a,b)

a==b:a,b的大小相同,并且各个位置对应的元素相等

Reversible Container:

描述:Reversible Container首先是一个ForwardContainer,但是它的Iterator是双向

的(Bidirectional Iterators.),因此也就支持反方向循环子。他所要求的Iterator也

有所加强,必定是Bidirectional Iterators,而不仅仅要求是Forward Iterators。

表达式语义:a,b表示Container对象。除了ForwardContainer的操作之外,还有rbeg

in(),rend().

rbegin: 返回一个反方向的循环子,他指向该Container的最后一个元素。

rend: 返回一个反方向的循环子,他指向该Container的第一个元素。

Random Access Container

描述:首先Random Access Container是一个Reversible Container,它提供访问任何一

个元素的方法。他所要求的Iterator也有所加强,必定是Random Access Iterator. ,而不

仅仅要求是Bidirectional Iterators。

表达式语义:a,b表示Container对象。除了Reversible Container的操作之外,还有a

[n]:其中0<N<a.size(),返回该容器的第N个元素

Sequence:

描述:Sequence首先是个可以动态改变大小的Forward Container,另外还支持插入和删除

元素的操作。

表达式语义:X Sequence类型的容器

a, b 容器X的对象

T 容器X包含的元素的数据类型

t 数据类型T的对象

p, q 容器a,b的Iterator对象

n 容器a,b的元素个数

除了Forward Container的操作外,还支持X(n,t),X a(n,t),X(n),X a(n,t),X(i,j),

X a(i,j), a.front(),a.insert(p,t) a.insert(p,n, t), a.insert(p,i,j), a.erase

(p), a.erase(p,q), a.clear(), a.resize(n,t), a.resize(n)

X(n,t) :创建一个Sequence,size()==n,而每个元素都是t的拷贝

X a(n,t):创建一个Sequence对象a , a.size()==n,而每个元素都是t的拷贝

X(n) :创建一个Sequence,size()==n,而每个元素都是T( ),缺省构造函数

X a(n,t):创建一个Sequence对象a , a.size()==n,而每个元素都是T( )

X(i,j) :创建一个Sequence对象 , a.size()==size(i-j),而元素是i,j之间的元素的拷

贝,i,j是一个T类型的元素的范围

X a(i,j) : 创建一个Sequence对象 a, a.size()==size(i-j),而元素是i,j之间的元素的

拷贝

a.insert(p,t):在p处插入一个元素t,a.size()加1,而元素相互间的位置不变

a.insert(p,n,t):在p处插入n个元素t,a.size()加n,而元素相互间的位置不变

a.insert(p,i,j):在p处插入元素,a.size()加(j-i),而元素相互间的位置不变

a.erase(p):删除p指向的元素,返回一个Iterator,指向p指向的元素的后一个元素

a.erase(p,q): 删除p,q之间的元素, 返回一个Iterator,指向q指向的元素的后一个元素

a.clear() : 相当于a.erase(a.begin,a.end)

a.resize(n,t):使Sequence a的size()=n,如果原来的size()>n,则相当于删除多余的元素

,如果原来的size()<n,则填充(n-size())个t元素

a.resize(n):相当于a.resize(n,T())

Front Insertion Sequence

描述:首先他肯定是一个Sequence,另外他还支持在Sequence的第一个元素之前插入,

或者取得第一个元素、或者删除第一个元素

表达式:除了Sequence的表达式之外,他还包括:front()、push_front()、pop_f

ront()。

a.front():取得a的第一个元素,相当于*(a.begin())

a.push_front(t):在a的第一个元素插入之前t,相当于a.insert(a.begin(),t)

a.pop_front():删除第一个元素,相当于a.erase(a.begin())

Back Insertion Sequence

描述:首先他肯定是一个Sequence,另外他还支持在Sequence的最后一个元素之后插入

,或者取得第一个元素、或者删除最后一个元素

表达式:除了Sequence的表达式之外,他还包括:back()、push_back()、pop_bac

k()。

a.back():取得a的最后一个元素,相当于*(a.end())

a.push_back(t):在a的最后一个元素插入之前t,相当于a.insert(a.end(),t)

a.pop_back():删除最后一个元素,相当于a.erase(a.end())

Associative Container

描述:他首先是一个Variable Sized Container, 支持根据key从而进行元素的插入和

删除操作(和Sequence不同的是,他无法指定插入和删除的位置)。在Associative Cont

ainer中,每一个元素都有一个相对应的key :在Simple Associative 中,key就是元素自

己本身,而在其他的Associative Container中,key是元素本身值的特殊的一部分。由于

元素是按照他们的key进行存储摆放的,因此也就要求每个key是永久不变的。在Simple A

ssociative 中,就是元素自己本身不可变;在Pair Associative Containers中,元素本

身是可变的,但是作为元素一部分的key就是不可变的。元素对应的key的不可变意味着As

sociative Container的元素是不可赋值(Assignable.)的。而不可赋值也就导致了一个

重要的后果:associative containers没有可变的循环子(mutable Iterator),因为mutab

le iterator要求可以赋值。就是说:如果i是一个mutable iterator,t是i指向的容器的

一个元素,那么*i=t是合法有效的。在Simple associative containers中,元素是永不可

变的,而其他的associative containers呢,则可以通过iterator改变元素的值。比如说P

air Associative Containers,循环子I是map<int,double>类型,则可以通过(*i).second=3改变元素的值。Unique Associative Containers中,所有的元素的

key值都是唯一的,而Unique Associative Containers中,允许多个元素拥有同样的key值

表达式语义:

a.erase(k):删除所有key值为k的元素。返回只是被删除的元素的个数,size减少key值为

k的元素的个数a.count(k)

a.erase(p):删除循环子p所指的元素,size减少1

a.erase(p, q):删除循环子p,q之间的元素,size 减少p,q间元素的个数]

a.clear():清空容器,相当于a.erase( a.begin(),a.end() )

a.find(k):查找key值为k的元素,如果有结果,则返回指向该元素的循环子,否则返回a.

end()

a.count(k):返回key值为k的元素的个数

a.equal_range(k):返回一对循环子,第一个循环子指向key值为k的第一个元素,第二个

元素指向key值为k的最后一个元素

Simple Associative Container

描述:他的key就是元素自己本身,每个元素本身因为就是key,所以元素都是不可变的

Pair Associative Container

描述:他的元素的为 pair<const key_type, data_type>,注意:这里的pair的第一个

参数是const,因为key是不可变的,所以元素也就不能是 pair< key_type, data_type>.

Sorted Associative Container

描述:他的key值是可以排序的,如果两个key是无法比出大小的,那么就认为是相等的

。如果key值大小写无关,那么"abcde" and "aBcDe"这两个key是认为相等的

表达式:

a.lower_bound(k):返回key值不小于k的最后一个元素,如果有多个和k同样的key,那么返

回第一个元素,如果不存在满足要求的元素, 那么返回end()

a.upper_bound(k):返回key值大于k的第一个元素,如果有多个和k 同样的key,那么返回和

k相同的key的元素中的最后一个的后一个元素,如果不存在满足要求的元素,返回end()

a.equal_range(k):返回一对循环子,第一个是a.lower_bound(k),第二个是a.upper_bou

nd(k)

Hashed Associative Container

描述:Hashed Associative Container是一个利用Hash Table的Container。他的元素的排

列方式不是一定有意义的,甚至于,他的元素是无序的。Hashed Associative Container

中的操作的复杂度是和容器的大小成线性比例的。

哈希函数定义:一元参数函数,输入为key值,返回该key对应的在hash中的位置偏移量。

每个元素将key值代入到hash函数中进行运算,从而决定该元素的存放位置。哈希函数的返

回值仅仅只能由函数带入的参数决定。而hash表可能存放的元素的个数除以hash表的长度

得到的商就是负载因子(load factor)。哈希函数对于Hashed Associative Container来

说很重要,如果哈希函数找得不好,会有冲突(这里的冲突是指两个不同的元素被映射到

同一个位置)。最差的就是所有的元素都被映射到同一个位置,整个函数的复杂度就会增

加,变成和容器的size成线性比例关系。

表达式语义:

X A type that is a model of Hashed Associative Container

a Object of type X

t Object of type X::value_type

k Object of type X::key_type

p, q Object of type X::iterator

n Object of type X::size_type

h Object of type X::hasher

c Object of type X::key_equal

X() ,X a:缺省构造函数,容器的size为0,容器拥有的长度是一个未定值,该容器使用

hasher()为他的哈希函数,而key_equal()作为它的元素的key值比较函数。

X(n) X a(n) :容器的size=0,但是容器拥有的长度是n, 使用hasher()为他的哈希函数,

而key_equal()作为它的元素的key值比较函数。

X(n, h) X a(n, h): 容器的size=0,但是容器拥有的长度是n, 使用h()为他的哈希函数,

而key_equal()作为它的元素的key值比较函数。

X(n, h, k) X a(n, h, k): 容器的size=0,但是容器拥有的长度是n, 使用h()为他的哈希

函数,而k()作为它的元素的key值比较函数。

a.hash_funct():返回该容器的哈希函数

a.erase(k):删除容器里面key值为k的元素,整个容器的size减少a.count(k),返回删除的

元素个数

a.find(k):查找key值为k的元素,如果有结果,则返回指向该元素的循环子,否则返回a

.end()

a.equal_range(k):返回一个范围,从第一个key为k的元素到最后一个key为k的元素,如

果没有找到,那么返回一个空的范围

a.bucket_count():返回容器的长度

a.resize(n):增加容器的长度,最少为n,如果原来的长度大于n,那么不动 。注意:改变

容器的大小并不会使得该容器的循环子失效,但是可能会影响各个循环子之间的先后的顺

序。本来在前面的循环子在容器的长度改变之后可能到了后面。

Unique Associative Container

描述:所有的元素的各自的key值各不相同,所以a.count(k)的返回值或者为0或者为1

,a.insert(t)在这里也具有一定的特殊性:如果t已经在Unique Associative Container

存在了,那么就不插入,如果不存在,则插入。返回值为pair<>,第一个元素是一个指向t

的循环子,第二个是一个是否进行插入的布尔值。

Multiple Associative Container

描述:取消了Unique Associative Container限制的容器

Unique Sorted Associative Container

描述:需要满足Sorted Associative Container和 Unique Associative Container的

容器

Multiple Sorted Associative Container

描述:需要满足Sorted Associative Container和Multiple Associative Container的

容器

Unique Hashed Associative Container

描述:需要满足Hashed Associative Container, Unique Associative Container的容

Multiple Hashed Associative Container

描述:需要满足Hashed Associative Container, Multiple Associative Container的

容器

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有