2012年8月25日学习笔记---顺序容器

1 讲一个容器初始化为另一个容器的副本
    前提是类型的匹配:容器类型和元素类型都必须相同。
2 初始化为一段元素的副本
   尽管不能用一种容器内的元素复制给另一种容器,但系统允许通过传递一对迭代器间接实现功能。使用迭代器时,不要求容器类型相同,容器内的元素类型也可以不相同,只要他们相互兼容。

vector<string> svec;
	//initialize slist with copy of each element ofsvec
	list<string> slist(svec.begin(),svec.end());
	//find midpoint in the svec
	vector<string>::iterator mid=svec.begin()+svec.size()/2;
	//initialize front with first half of svec:The elememts up to but not including *mid
	deque<string> front(svec.begin(),mid);
	//initialize front with second half of svec:The elememts  *mid through end of svec
	deque<string> back(mid,svec.end());

其实指针也是一种迭代器。
char *words[]={"stately","plump","buck","mulligan"};
	size_t words_size=sizeof(words)/sizeof(char*);
	list<string> word2(words,words+words_size);

3 分配和初始化指定数目的元素
  创建顺序容器时,可现实的制定容器大小和一个(可选的)元素初始化式。容器大小可以是常量或者非常量表达式。
const list<int>::size_type list_size=64;
	list<string> slist(list_size,"xiaoyu");//64 strings,each is xiaoyu
    
	list<int> ilist(list_size);//64 elements, each initialized to 0
注意:接受容器大小做形参的构造函数只是用与顺序容器,而关联容器不支持这种初始化。
	int ai[6]={1,2,3,4,5,6};
	string sa[6]={"1","2","3","4","5","6"};
	vector<string> svec(sa,sa+6);
	list<string> slist(sa+6,sa);//error 顺序出错
解释复制容器对象的构造函数和使用两个迭代器的构造函数之间的差别
          答: 差别在于复制容器对象的构造函数只能将一个容器初始化为另一个容器的副本,即复制一个容器内的全部元素,这种构造函数要求两容器是同类型的,元素也是相同类型的;使用两个迭代器的够凹函数可以将一个容器初始化为另一个容器的子序列,而且采用这种构造函数不要求两个容器是同类型的,其元素只要能相互兼容就可以。
4 容器内元素的类型约束
容器元素类型必须满足两方面:
   1 元素类型必须支持赋值运算。
   2 元素类型的对象必须可以复制。
  注意:引用不支持一般意义的赋值运算,因此没有元素是引用类型的容器。除了输入输出标准库类型(IO库类型不支持赋值或复制,因此不可以创建存放IO类型对象的容器)和auto_ptr类型外,所有其他的标准库类型都是有效的容器元素类型。

例如类Foo没有默认的构造函数,但提供了需要一个int型参数的构造函数。
	vector<Foo> empty;
	vector<Foo> bad(10);
	vector<Foo> Ok(10,1);

iter1-iter2;>,>=,<,<=只适用于vector和deque类型的迭代器。
 关系操作符只适用于vector和deque容器。这是因为只有这两种容器为其元素提供快速、随机的访问。他们确保可根据元素位置直接用小的访问指定的容器元素。这两种容器都支持通过元素位置实现的随机访问,因此它们的迭代器可以有效的实现算术和关系运算。
例如: vector<int>::iterator iter=vec,begin()+vec.size()/2;
另外: list<int> ilist(vec.begin(),iter);
ilist.begin()+ilist.size()/2;//error:no addition on list iterator.因为list迭代器不支持算术运算,也不支持关系运算,它只提供潜质和后置的自增、自减运算以及相等或者不等运算。
5  容器元素都是副本:
   在容器添加元素时,系统是将元素值复制到容器里。
	list<string> lst;
	list<string>::iterator iter=lst.begin();
	string word;
	while(cin>>word)
		iter=lst.insert(iter,word);
上述代码等效于调用push_front函数。

下标访问的叫随机访问容器 只有vector string等 a[1]....
list不能通过下标访问 只能通过iterator一个个访问
resize操作可能会使迭代器失效。在vector或deque容器上做resize操作有可能使所有的迭代器都失效。
使用只带有一个长度参数的resize操作对于元素类型来说有什么要求?
答: 因为只带有一个长度参数的resize操作对新添加的元素进行值初始化,所以元素类型如果是类类型,则该类必须显示提供默认构造函数,或者该类不显示提供任何构造函数以便使用编译器自动合成的默认构造函数。(待续...)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值