现在的位置: 首页 > 综合 > 正文

《C++Primer》学习笔记(11-12章)

2017年10月12日 ⁄ 综合 ⁄ 共 2887字 ⁄ 字号 评论关闭


第十一章
算法

1.   size_t  <cstddef>

back_inserter <iterator>

2.   提到的算法

find(vec.begin(), vec.end(), ival);

find_first_of(vec1.begin(), vec1.end(),vec2.begin(),vec2.end());

accumulate(vec.begin(), vec.end(), ival); // 第三个实参提供累加初始值和关联的类型

 

//写入运算不检查目标的大小是否满足写入的数目

fill(vec.begin(), vec.end(), 0); //  是写入安全的

fill_n(vec.begin(), 2, 0); // 前两个元素赋为0 ,必须保证vec至少有2个元素,否则运行错

fill_n(back_inserter(vec),2, 0); // 相当于在vec后面push_back两个0

    back_inserter是迭代器适配器

copy(ilst.begin(), ilst.end(),back_inserter(ivec));

replace(ilst.begin(), ilst.end(), 0, 42); // 等于0的元素换成42

replace_copy(ilst.begin(), ilst.end(),back_inserter(vec), 0, 42); // ilst不变,复制到vec中,其中0换成42

 

sort(vec.begin(), vec.end());

vector<string>::iterator end_unique = unique(words.begin(),word.end()); // 把重复单词移动到后面去,返回无复下一位置

       算法不改变容器大小,要删掉重复元素必须使用容器操作 words.erase(end_unique,words.end());

 

count_if(words.begin(), words.end(), GT6); //函数要求谓词函数只能一个参数,即迭代器范围内的元素

stable_sort(words.begin(), words.end(),isShorter);

以上四五行参考代码test统计六个及以上字母组成的单词.cpp

3.   front_inserter使用push_front,这个算法不能用在Vector上,它没有这个操作

inserter(ilst, it); //指定插入位置, 在it之前插

    注意:copy(ilst.begin(), ilst.end(), inserter(ilst2,ilst2.begin()));//正序插入

                                          //每次都在固定位置插入

       copy(ilst.begin(),ilst.end(), front_inserter(ilst1));//逆序插入

4.   d

    list<int> ilst;

    for (inti=0; i<5; ++i) {

       ilst.push_back(i);

       ilst.push_back(i);

    }

    ilst.sort();

    printList(ilst);

    ilst.unique(); //
删掉,而不是后移重复元素,这不是算法函数,所以真正修改了基础容器

                  // 真正修改基础容器的还有remove,算法函数中remove是把等于指定值的元素们

                  // 前移,返回第一个不等于val的元素的位置

printList(ilst); 

5.    

6.   ‘

1.   非static成员函数有this.  Const必须同时出现在定义和声明中,不然出错

2.   只有类中有很少的方法且有公有数据时,使用Struct,或只有公有数据时。

3.   封装好处:一,防止用户级破坏,二,只要接口不变,不须改动用户级代码。 Cpp文件才是类定义文件

4.   前向声明是不完全类型,只能用于定义指针或引用(只是定义,不能使用它们来访问成员),或声明使用该类型作为形参或返回值的函数。 可以定义该类型的static对象

5.   this的类型是一个指向类类型的const指针。

const成员函数只能返回*this作为一个const引用:对于返回*this或this的函数,const若有则必同时有

const Dog* run1() const { return this; } // const成员函数中,this是指向const对象的const指针,函数返回类型必须是const的

const Dog& run2() const { return *this; } // const成员函数中,*this是const对象,返回值只能是一个const的引用

6.   基于成员函数是否const可以重载,基于形参是否指向const对象可以重载。Const对象使用const成员。

7.   可变数据成员mutable,这样const成员函数可以改变它或它是const对象的成员时也可改

8.   形参表和函数体处于类作用域中

Char Screen::get(indexr, index c) const { // index前不用加Screen

    Indexrow = r*width;

    return...

}

9.   Student *sp = new Student();

Student s = Student;

 

构造函数不能是const的。  创建const对象时,运行一个普通构造函数来初始化const对象

    构造函数的初始化在冒号之后,在执行构造函数之前。初始化列表中没有写出来的成员的初始化情况:对于类类型则调用默认构造函数,对于内置或复合类型的初始化:(如果对象定义在局部作用域中,则不进行初始化,如果定义在全局作用域中,初始化为0),所以,含有内置类型或复合类型的类应该定义自己的构造函数来初始化这些成员,不应该依赖合成的构函。初始化顺序是成员的定义顺序,而非初始化列表写的顺序

 

    必须在初始化列表中初始化:无默认构函的对象成员,const或引用成员

 

    如果没有自己定义了构函,且都是单参并有各自的默认实参:error

   

    explicit:避免了单参构函的形参类型到该类类型的隐式转换  它只能使用在类定义体内的构函前面的声明上,类定义体外此构函定义时前面不能加explicit

Studentstu = stu1; 执行复制构函

StudentStu(“leiming”, 24); // 直接初始化

Studentstu(stu1); // 复制构函

10.  对于没有定义构函的且成员全是public的类可以使用Data val2 = {23, “abc”}的方式初始化

struct Data {int ival; char *p;};

11.  友元可以是非成员函数,可以是已知类的成员函数,也可以是类

12.  若要将成员函数定义为inline,则声明的时候可以不必写inline,它是用于定义的关键字。定义为inline

抱歉!评论已关闭.