03.28_111期_C++_vector特性和使用

        如果写出vector这个类的时候不用缺省值,也不用初始化列表
        那么可以编写如下构造函数,利用半缺省参数给没有初始化的vector实例进行赋空
        但如果存在下面这两句话的设计
        template <class InputIterator>
        vector(InputIterator first, InputIterator last)
        则在调用的时候,写下后面的代码:vector<int> v1(10, 1);  
        将不会调用vector(size_t n, const T& val = T())
        因为还要对10进行类型转换,
         编译器去找的时候会去找vector(InputIterator first, InputIterator last)
        作为更匹配的构造函数,因为其类型更匹配
        所以实际上C++标准库中将这种构造函数设计成
        vector(size_t n, const T& val = T());
        vector(int n, const T& val = T());  这两个版本 

        想要支持 将字符数组 / 整型数组直接作为vector 的构造函数的实参
        必须在initializer_list<T> 已经设计完毕的基础上
        initializer_list<T>是一个类,
                其成员变量中有两个迭代器,是数组的首尾指针
                其成员函数中有size,反映数组中的元素个数
         注意:
             1. vector<int> v1 = { 1, 2, 3, 4, 5, 6, 7, 8 };这句话合法
                合法的原因:
                   在创建临时变量实例时,vector<int> tmp({ 1, 2, 3, 4, 5, 6, 7, 8 });合法
             2. vector<int> v1 = { 1, 2, 3, 4, 5, 6, 7, 8 };
                看起来就像发生了隐式类型转换

        类中的成员函数可以是一个模板函数
        那么构造函数可以用一下的形式进行编写,通过两个迭代器实现

                注意:下面的memcpy不能保证深拷贝
                    因为如果 此时vector中存放的都是string类型的变量
                    那么memcpy只会把_start中每个string的实例中的成员变量
                        依次赋值给tmp,由于string的成员变量是:_arr; _size; _capacity
                        所以此时只会让tmp中的每个string实例中的成员和_start中的地址相同
                    那么对tmp 和_start进行析构时,将会对同一块空间析构两次
                  所以应该使用自定义类型本身的赋值重载,实现地址的深拷贝

        如果用模板 + 迭代器的形式实现构造函数,
        那么迭代器可以将字符型指针作为迭代器,传入到一个以int类型为内容的vector容器中

        实际上C++库中把 { 1, 2, 3, 4, 5, 6, 7, 8 }这种变量
         直接封装成了一个类,该类的类型为initializer_list<int>
         即下面的代码中x 是initializer_list<int> 类型的变量
         std::vector<int> v1 = { 1, 2, 3, 4, 5, 6, 7, 8 };这句话能执行,
         本质上是因为库中写了一个vector(initializer_list<T> arr);的构造函数
         
         下面说明std::vector<int> v1 = { 1, 2, 3, 4, 5, 6, 7, 8 };这句话的执行过程
         
         先利用{ 1, 2, 3, 4, 5, 6, 7, 8 }这个initializer_list<int> 类型的变量
         执行vector<int> tmp({ 1, 2, 3, 4, 5, 6, 7, 8 });
         调用vector中单参数的构造函数
         产生一个vector<int>类型的临时变量
         再将调用 vector中的拷贝构造,拷贝构造传入的形参就是这个临时变量
         这也说明了在设计 拷贝构造 和 push_back 这样的成员函数时
         需要对形参的类型加一个const限定 

         删除偶数
        下面的程序加else是必须的,这是因为迭代器不同域数组下标
        执行erase方法之后会立马将后面的所有元素往前移动
        那么此时如果要实现删除偶数只能通过++it;
        对于VS平台下,其C++库中要求:只要使用了erase方法
        要想继续使用iterator,只能通过erase方法的返回值更新迭代器,
         此时VS下的erase方法将会返回当前删除的元素对应的迭代器
         注意:此时的迭代器不是指针,不是指针这一点是和linux平台下是不同的

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值