cpp269到313页笔记和习题解答

庭博网校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)正确。

 

你可能感兴趣的:(cpp269到313页笔记和习题解答)