庭博网校QQ:14280784 86974558
学习内容和顺序:
1、C语言;
2、C++语言;
3、VC++;
4、win32编程;
5、数据库编程;
6、网络编程;
7、多线程编程。
初中毕业一年3500元、高中毕业一年3000元、大专以上一年2500元。每天20:00到22:00上课
庭博网校网络课堂的进入方法:先到http://www.51lele.net/610028注册一个免费的帐号,同时下载他的乐乐软件,安装之后就可以进入大厅->技术学院->庭博网校听课了
C++语言中的数据类型要成为容器元素要满足2个条件:
1.元素类型必须支持赋值运算,比如:int ,float ;
2.元素类型的对象必须可以复制。
引用不能做容器的元素。因为引用不支持赋值运算。
IO标准库不能做容器的元素。它也不支持复制或赋值。
内置的C++数据类型可以做容器的元素。
标准库也可以做容器的元素。
自定义的类,如果定义了赋值运算,和复制构造函数也可以支持容器的元素
。
容器的特殊要求是什么意思?
就是自定义的类做容器的元素时,自定义的类定义自己的默认构造函数。
比如:Foo如果没有默认构造函数,
则vector<Foo> empty; 这是正确的。
vector<Foo> bad(10);这是错误的,因为Foo没有提供Foo(int )这样的默认构造函
数。
vector<Foo> ok(10,1);这是正确的。
要解答上面的问题,关键点在区分什么时候是容器的构造函数,什么时候是元素类型的
构造函数。
容器的容器
就是容器的元素的类型仍然是一个容器。
比如:vector< vector<string> > lines;
vector< vector<string>> lines;//错误,因为后面两个>>之间没有空格
。
习题9.4
定义一个list对象来存储deque对象里的元素,该deque对象存放在int型元素。
解:deque<int> a;
list<int> b(a.begin(),a.end());
习题:9.5
为什么我们不可以使用容器来存储iostream对象?
解:因为iostream对象它是IO标准库的对象,它不能复制和赋值。
习题:9.6
假设有一个名为Foo的类,这个类没有默认构造函数,但提供了需要一个int型参
数的构造函数,定义一个存放Foo的list对象,该对象有10个元素。
解:list<Foo> a(10,5);//表示list有一个带有两个参数的构造函数,前面的10
是给list的,后面的5是给Foo的。
因为Foo有一个需要int型参数的构造函数,所以可以这样定义,所以可以这
样定义。
//=================================================================
迭代器运算:
把迭代器当成指针就很好理解了。
*iter;
iter++;
iter--;
++iter;
--iter;
iter1==iter2;
iter1!=iter2;
在什么情况下两个迭代器相等?
答:(1)指向同一个元素时;(2)同一个容器的超出未端的下一位置时。
为什么vector和deque类型支持iter+n; iter-n; iter1+=iter2; iter1-
iter2; >,<=,<,<=;而list不支持呢?
答:因为vector和deque在内存中是顺序存放的,而list不是顺序存放的。
也就是vector和deque可以随机的访问。而list不能随机的访问,它要访问一
个元素必须从头进行查找,因为它是链表。
迭代器vector的中点位置计算:
答:vector<int>::itrator iter=vec.begin()+vec.size()/2;
但是同样多的元素,list容器象上面这样计算确是错误的。
例如:
list<int> ilist(vec.begin(),vec.end());
然后list<int>::iterator iter=ilist.begin()+ilist.size()/2;
就错了。为什么呢?因为链表不是顺序存放的。
习题9.7
下面的程序错在哪里?如何改正。
list<int> lst1;
list<int>::iterator iter1=lst1.begin(),
iter2=lst1.end();
while(iter1<iter2) /*...*/
答:while(iter1<iter2)这一句出错。
因为list的迭代器没有<这种运算。改正方法是:while(iter1!=iter2)
习题9.8
假设vec_iter与vector对象的一个元素捆绑在一起,该vector对象存放string类
型的元素,请问下面的语句实现什么功能?
if(vec_iter->empty())/*......*/
答:vector<string> a;
vector<string>::iterator vec_iter;
那么if(vec_iter->empty())是判断迭代器所指的元素是否为空。
习题9.9
编写一个循环将list容器的元素逆序输出。
答:
#include "stdafx.h"
#include "iostream"
#include "list"
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
list<int> a;
int w;
while(cin>>w)
a.push_back(w);
fflush(stdin);
list<int>::iterator i;
for(i=(--a.end());i!=a.begin();i--)
cout<<*i<<" ";
cout<<*i<<endl;
getchar();
return 0;
}
习题9.10
下列迭代器的用法哪些(如果有的话)是错误的?
const vector<int> ivec(10);
vector<string> svec(10);
list<int> ilist(10);
(a) vector<int>::iterator it=ivec.begin();
(b) list<int>::iterator it=ilist.begin()+2;
(c) vector<string>::iterator it=&svec[0];
(d) for(vector<string>::iterator
it=svec.begin(); it!=0; ++it)
//...
答:(a)正确;
(b)错误;因为list容器迭代器没有+n的运算。
(c)正确;
(d)正确。