代号3 发表于 2018-4-30 11:36:04

c到c++过度 第五天笔记

本帖最后由 代号3 于 2018-5-9 15:55 编辑


427笔记
STL
STL vector(动态数组 容器)
                增删查改
UML
                类和类之间的关系
                使用图形化描述类和类之间的关系
控制台编程
                光标属性
                                大小
                                是否隐藏
                                光标坐标
                控制台输出文本颜色设置
               
STL
        标准模板库        包含大量数据结构和算法部件
                                                        高可重用性 大量使用模板技术(泛型化编程)
                                                        c++标准一部分不需要额外安装
        使用时机
                                操作大量元素时使用某种容器
                                c只有一种内置容器 数组但数组必须提前确定大小 仅能保存数组 不能支持数据操作
        部件
                        容器
                                        存放数据的位置
                                        动态数组 栈~~~
                        算法
                                                方便对容器中的数据进行各种操作
                                                如排序 查找MAX元素
                        迭代器
                                        泛化指针类型
                                        若迭代器指向了容器中某个成员 迭代器将可以通过自增自减遍历容器中所有的成员
                                       
                                        联系容器和算法的媒介 算法操作容器的接口
        使用后附代码示例
                        标准头文件名称和容器名一致
                        #        include<vector>
                        using std::vector
                       
                        容器都是基于模板实现        使用前必须先指明模板
                       
                        #include<iostream>
                        #include<vector>
                        using namespace std;
                        int main()
                        {
                                vector<int> nVec;
                                vector<double> dVec;//定义对象
                               
                                nVec.push_back(1);//添加新元素
                               
                                vector<int>::iterator itr;//获取元素迭代器
                               
                                itr=nVec.begin();//bigin返回是第0个元素的迭代器
                               
                                nVec.insert(itr+2,5)//插入数据:形参1:迭代器用于表示位置 形参2:要插入的数据
                               
                                int nVal=nVec;//取值                                                        访问动态数组中的元素
                                nVec=100;
                               
                                nVal=nVec.at(1);//访问动态数组中的元素 使用at()
                                nVec.at(0)=1011;
                               
                                for(int i=0;i<nVec.size();i++)                                                                //查找:1·遍历vector查找指定的数据
                                        {                                                                                                                                                        //vector.size()得到元素个数
                                                        if(nVec==2)
                                                        {
                                                                cout<<"元素2在下标"<<i<<endl;
                                                                break;
                                                        }
                                        }
                                       
                                for(auto itr=nVec.begin();        itr!=nVec.end();++itr)                //2·循环从0元素的迭代器开始       
                                {                                                                                                                                                                                        循环自增迭代器 迭代器指向下移               
                                                cout<<*itr;                                                                                                                                        end()返回值是最后一个元素的下一个       
                                                if(*itr==8)                                                                                                                                                位置
                                                {                                                                                                                               
                                                        itr=nVec.erase(itr);                                                                                                                ??野指针 置空end()
                                                        break;                                                                                                                        //
                                                }
                                }               
                        }
                       
        vector(动态数组) 拥有拓展功能 连续存储空间
                       
                        支持[]符号快速随机访问 由于连续存储空间 在插入删除操作方面 效率比较慢
               
                成员
                        增        push_back                 在末尾添加一个元素
                                        insert                                插入一个元素
                                       
                        删        pop_back                删除最后一个元素
                                        erase                                删除某个元素
                       
                        查        size                                        得到字符串的大小       
                                        empty                                判断是否为空
                                        []                                                返回元素
                                        =                                                复制副本
                        其他
                                        重载运算符
                                        []= > < >= <= != ==
                       
                clear函数后遗症                                                                                                                       
                #include <iostream>
                #include <sstream>
                #include <string>

                using namespace std;

                int main()
        {
                        stringstream ss;
                        int i = 0;
                        for(i = 0; i < 5; i++ )
                {
                        ss << "hello";
                        string s = ss.str();
                        cout << s.size() << endl;
         
                        // 如下两部可彻底恢复ss
                        ss.clear(); // 恢复状态
                        ss.str(""); // 恢复值                精髓                                
                }
        }
                       
                       
        示例                                        //代码在上
                增加元素
               
                        获取元素迭代器(定义对象 (迭代器))
                        vector<类型>迭代器名
                       
                插入数据
                        形参1        迭代器 用于表示位置
                        形参2        要插入的数据
                       
        查找
                数组                                vector遍历                                vector.size()获取元素个数
               
                迭代器将可以通过自增自减遍历容器中所有的成员   
                end()指向最后一个元素的下一个位置(无效位置)                                       
                       
                itr是一个指向元素的迭代器(指针)可以使用*运算符来取得指向的内容(元素的地址)
               
        删除
       
        输出所有
                        for(double &val:dVec)auto 自动类型(变量自适应)
                        {
                                        cout<<val<<',';
                        }
                        cout <<endl;
                       
                       
类与类的关系
       
        继承
                       
        组合
                       
        友元
       
                1)C++中引入友元函数,是为在该类中提供一个对外(除了他自己意外)访问的窗口;
                2)这个友元函数他不属于该类的成员函数,他是定义在类外的普通函数,
                只是在类中声明该函数可以直接访问类中的private或者protected成员               

                friend <返回类型> <函数名> (<参数列表>);
               
        使用友元函数注意的要点:

                        类中通过使用关键字friend 来修饰友元函数,但该函数并不是类的成员函数,其声明可以放在
        类的私有部分,也可放在共有部分。友元函数的定义在类体外实现,
        不需要加类限定。
       
                        一个类中的成员函数可以是另外一个类的友元函数,而且一个函数可以是多个类友元函数。

                        友元函数可以访问类中的私有成员和其他数据,但是访问不可直接使用数据成员,
        需要通过对对象进行引用。

                        友元函数在调用上同一般函数一样,不必通过对对象进行引用。       
               
UML图描述类
        UML   统一建模语言
       
        功能模型
                        用户角度展示系统功能
                        直观展示程序功能
       
        对象模型
                        采用对象 属性(成员变量) 操作(成员函数) 关联等概念展示系统的结构和基础
                        程序员角度分析程序功能
                                一个项目中的对象 属性 操作
       
        动态模型
                        展示系统的内部行为
                                展示每个方法的具体实现
                                伪代码示意
                               
        类图
                        描述系统中所包含的类以及它们之间的相互关系
                        帮助人们理解项目
                       
                类                        使用包含类名 属性 操作且带有分隔线的长方形来表示
                       
                        类名       
                                        必须有一个名字 字符串
                        属性
                       
                        成员变量
                                       
                                        可见性(访问控制符) 名称:类型[=默认值]
                                                公 +
                                                保 -
                                                私 #
                                               
                        操作
                                        可见性 名称(参数列表)[:返回值类型]
                                       
        关系
                        关联 类与类之间最常用关系                                        类属性
                                                结构化关系
                                                通常将一个类的对象作为另一类的成员量
                                               
                                        单向关联
                                                用带箭头的实线表示
                                               
                                        双向关联
                                                实线
                                                eg:班级类与学生类
                               
                                        自关联
                                                                                                //百度补充
                                                类的属性类型为类本身
                                               
                                        多重性关联
                                                                                                        //百度补充
                                                一对多
                                                eg:一个班级可以有N个学生 但一个学生只有一个班级
                               
                                聚合(弱性关联)
                                        成员变量关系       
                                        整体与部分可分离        各自拥有生命周期
                                        部分可以属于多个整体对象 可以为多个整体对象共享
                                                eg:计算机与CPU         公司与员工
                                                                class A {...}
                                                         class B { A* a; .....}
                                                                即类B包含类A的指针;
                                组合
                                        实心菱形(强性关联)
                                        eg:class A{...}
                                                 class B{ A a; ...}
                                                        即类B包含类A的对象。
                                                共享内存 A毁B毁
                               
                                        组合是关联关系的一种特例,体现是"包含一种XXX "的关系,        这种关系比聚合更强,
                也称为强聚合;他同样体现整体与部分间的关系,但此时整体与部分是不可分的,整体的
                生命周期结束也就意味着部分的生命周期结束;
                                        比如你和你的大脑;表现在代码层面,和关联关系是一致的,只能从语义级别来区分;       
                       
                        依赖                假设A类的变化引起了B类的变化,则说B类依赖于A类。
                                        虚线箭头                        成员函数参数
                                依赖关系有如下三种情况:
                                        1、A类是B类中的(某中方法的)局部变量;
                                        2、A类是B类方法当中的一个参数;
                                        3、A类向B类发送消息,从而影响B类发生变化;
                                使用关系是具有偶然性的、临时性的、非常弱的,但是B类的变化会影响到A;
                       
                                       
                        泛化        A是B和C的父类,B,C具有公共类(父类)A,说明A是B,C的一般化(概括,也称泛化)
                                        继承关系
                                        基类与子类关系
                                       
                        接口与实现
                                        带空心三角形的虚线
                                        接口使用抽象类实现(有纯虚函数的类)

        UML中,变量的定义形式为 :
                        变量名 : 变量类型 = 初始值.
                        eg:
                        定义成员变量:
                                m_x : int = 0
                                m_y : int
                        定义函数
                                move(x : int , y : int ) : int   等价于C中的 int move(int x , int y);       
                               
控制台编程
               
                头文件
                                #include<windouws.h>
                               
                        第一个参数为句柄 this指针
                                       
                                        标准输出句柄
                                                专门控制输出 光标位置 文字颜色
                                        标准输入句柄
                                                捕获鼠标在控制台中的坐标
                                                捕获按键
                                void show(HANDLE hStdOut,
                                                                        const char* pStr,
                                                                        SHORT x,SHORT y,
                                                                        WORD color=0x0A(0x后面两位十六进制分别设置前后背景色))
                                                {
                                                                SetConsoleCursorPosition(hStdOut,{x,y});
                                                                SetConsoleTextAttribute(hStdOt,color);
                                                                cout<<pStr;
                                                }
                                int main()
                                {
                                                获取控制台操作句柄
                                               
                                }
                设置光标属性
               
                        语法
                       
                                参数 输出句柄       
                               
                        可见性和大小
                       
                        光标的坐标               
               
               
                设置文字颜色
                // 设置控制台光标信息(可见性,大小)
        CONSOLE_CURSOR_INFO cci = { 0 };
        cci.bVisible = FALSE;
        cci.dwSize = 5;
        SetConsoleCursorInfo(hStdOut,
                                               &cci );

        cout << "HHHHH";
        COORD pos = { 10,10 };
        SetConsoleCursorPosition( hStdOut ,
                                                          pos );
        cout << "HHHHH";

        // 设置文字颜色
        SetConsoleTextAttribute( hStdOut ,
                                                       0x0A );

        for( int i = 0; i < 16; ++i ) {
                for( int j = 0; j < 16; ++j ) {
                        WORD color;
                        // i作为背景色
                        // j作为前景色
                        color = (i << 4) | j;
                        // 设置颜色
                        SetConsoleTextAttribute( hStdOut ,
                                                                       color );
                        cout << "■";
                }
                       
               


本次为笔记最后一次更新 以后转为发经验总结之类的以点破面为目标的帖子 坚持ING~
页: [1]
查看完整版本: c到c++过度 第五天笔记