抽象容器类型:顺序容器及关联容器

来源:互联网 发布:matlab 矩阵行列式 编辑:程序博客网 时间:2024/05/16 19:46

顺序容器:拥有由单一类型元素组成的一个有序集合,list 和vector,deque

关联容器: 支持查询一个元素是否存在并且可以有效地获取元素,map( 映射)和set( 集合)。map 是一个键/值key/value 对键key 用于查询而值value 包含我们希望使用的数据。 set包含一个单一键值有效支持关于元素是否存在的查询。map 和set 都只包含每个键的惟一出现,即每个键只允许出现一次。multimap 多映射 和multiset 多集合支持同一个键的多次出现。

顺序容器中vector deque 以及list 都是动态增长的,在这三者之中选择的准则主要是关注插入特性以及对元素的后续访问要求。

vector 表示一段连续的内存区域每个元素被顺序存储在这段内存中,随机访问效率比较高,任意位置插入、删除效率比较低

deque 也表示一段连续的内存区域但是与vector 不同的是它支持高效地在其首部插入和删除元素它通过两级数组结构来实现一级表示实际的容器第二级指向容器的首和尾。 

list 表示非连续的内存区域,并通过一对指向首尾元素的指针双向链接起来,从而允许向前和向后两个方向进行遍历,在list 的任意位置插入和删除元素的效率都很高。指针必须被重新赋值,但是不需要用拷贝元素来实现移动,另一方面它对随机访问的支持并不好,访问一个元素需要遍历中间的元素,另外每个元素还有两个指针的额外空间开销 。

选择准则: 

       随机访问一个容器则vector 要比list 好得多 
       已知要存储元素的个数则vector 又是一个比list 好的选择 
       需要的不只是在容器两端插入和删除元素则list 显然要比vector 好 
       需要在容器首部插入和删除元素否则vector 要比deque 好

容量是指在容器下一次需要增长自己之前能够被加入到容器中的元素的总数容量只与连续存储的容器相关,调用capacity()来获取容器的容量;长度size 是指容器当前拥有元素的个数,调用size()来获取。

对于小的数据类型vector 的性能要比list 好得多而对于大型的数 据类型则相反list 的性能要好得多区别是由于vector 需要重新增长以及拷贝元素但是 数据类型的长度不是影响容器性能的惟一标准数据类型的复杂性也会影响到元素插入的性 能。

reserve() 操作允许程序员将容器的容量设置成一个显式指定的值,svec.reserve( 32 ); //  把容量设置为32 。

定义顺序容器

1.头文件

#include <vector> 
#include <list> 
#include <deque> 
#include <map> 
#include <set> 

2.定义

vector< string > svec; 
list< int > ilist; 

3.插入元素

vector,list,deque:插入元素最简单的方法是push_back(),它将元素插入在容器的尾部。

list,deque:push_front() ,它把新元素插入在链表的前端

3.初始化

list< int > ilist( list_size, - 1 ); 

vector< string > svec( 24, "pooh" ); 

4.重新设置容器的长度

svec.resize( 2 * svec.size() ); 

现有的容器对象初始化一个新的容器对象

vector< string > svec2( svec );
list< int > ilist2( ilist ); 

5.每个容器支持一组关系操作符,我们可以用来比较两个容器。

6. iterator 算术论算只适用于vector 或deque。

迭代器

每种容器类型都提供一个begin()和一个end()成员函数 
       begin()返回一个iterator 它指向容器的第一个元素 
       end()返回一个iterator 它指向容器的末元素的下一个位置 

关键词:iterator与const iterator(以只读方式访问容器的底层元素)

容器对象也可以用由一对iterator 标记的元素任一位置之间的拷贝来初始化。vector<string>::iterator it =  svec.begin() + svec.size()/2;   vector<string> svec3( svec.begin(), it ); 

istream_iterator 类型

// 将输入流iterator 绑定到标准输入上 
  istream_iterator<string> infile( cin ); 
 
 // 标记流结束位置的输入流iterator 
 istream_iterator<string> eos; 
 
 // 利用通过cin 输入的值初始化svec 
  vector<string> svec( infile, eos ); 
 
 // 处理 svec 

顺序序列操作

1.插入操作

insert()的第一个参数是一个位置指向容器中某个位置的,iterator 第二个参数 是将要被插入。

string son( "Danny" ); 
list<string>::iterator iter; 
 
iter = find( slist.begin(), slist.end(), son ); //find() 返回被查找元素在容器中的位置
slist.insert( iter, spouse );

insert()方法的第二种形式支持在某个位置插入指定数量的元素。svec.insert( svec.begin(), 10, anna ); //在vector 的开始处插入10个Anna 。

 insert()方法的最后一种形式支持向容器插入一段范围内的元素。string sarray[4] = { "quasi", "simba", "frollo", "scar" }; svec.insert( svec.begin(), sarray, sarray+4 ); 

2.删除操作

删除容器内元素的一般形式是一对erase() 方法,一个删除单个元素,另一个删除由一对 iterator 标记的一段范围内的元素,删除容器末元素的简短方法由pop_back() 方法支持。

删除某个元素:find( slist.begin(), slist.end(), searchValue ); slist.erase( iter ); 

删除一段元素:slist.erase( slist.begin(), slist.end() ); 

删除末尾元素:slist.pop_back();

插入末尾元素:slist.push_back( *iter ); 

3.赋值与对换

slist1 = slist2;原内容已删除。

slist1.swap( slist2 ); slist2 现在含有slist1 中原来含有的元素的拷贝。

如果两个容器的长度不同则容器的长度就被重新设置且等于被拷贝容器的长度。

4.存储文本行

istream&   getline( istream &is, string str, char delimiter );将文件输入流中is的内容读入到str中,直到遇到deliniter结束。

5.查找匹配字符:

find_first_of()查找与被搜索字符串中任意一个字符相匹配的第一次出现并返回它的索引位置

string::size_type pos = name.find_first_of( numerics ); 


原创粉丝点击