• vector里的max_size(),capacity,size(),resize(),reserve()


    我的stlport是5.2.1,下面的一些是我看书和看源码得出的,可能有不对的地方,望大家指出

    一般知道:

    size()是当前元素个数

    capacity()是当前可容纳个数

    那max_size()又是什么?

    看stlport源码如下

     size_type max_size() const {
        size_type __vector_max_size = size_type(-1) / sizeof(_Tp);
        typename allocator_type::size_type __alloc_max_size = this->_M_end_of_storage.max_size();
        return (__alloc_max_seize < __vector_max_size)?__alloc_max_size:__vector_max_size;

    可知是对于vector来说是最多可以占用的元素个数。

    而resize()和reserve()

    resize()重载了一次

    resize(size_type,const T&)

    resize(size_type)

    而resize的源码参见stl源码剖析

    void resize(size_type new_size,const T&x)
    {
      if(new_size<size())
          erase(begin()+new_size,end());
      else
          insert(end(),new_size-size(),x);
    }
    
    void resize(size_type new_size)
    {
       resize(new_size,T());
    }

    可以发现几点

    1.resize可以“缩小“size,而且是从前面开始erase掉,而erase是不会造成reallocate的,所以如果new_size<size(),capacity不变。

    2.resize可以扩大capacity,如果new_size大于等于size(),引起insert,insert是可能造成reallocate的,那么也就是说,既然reallocate了,迭代器也可能失效。

    3.当然对与vector内的型别,如果自定义,必须得定义默认构造函数.

    再看reserve ,stl源码剖析上似乎没看到reserve,进入调试看了下

    源码如下

    template <class _Tp, class _Alloc>
    void vector<_Tp, _Alloc>::reserve(size_type __n) {
      if (capacity() < __n) {
        if (max_size() < __n) {
          this->_M_throw_length_error();
        }
    
        const size_type __old_size = size();
        pointer __tmp;
        if (this->_M_start) {
          __tmp = _M_allocate_and_copy(__n, this->_M_start, this->_M_finish);
          _M_clear();
        } else {
          __tmp = this->_M_end_of_storage.allocate(__n, __n);
        }
        _M_set(__tmp, __tmp + __old_size, __tmp + __n);
      }
    }

    可以发现:

    1.若capacity()>=_n时,reserve是直接返回的.不做任何操作

    2.这里我debug了一下,发现stlport5.2.1和书里讲的还是有点不一样,首先end_of_storage不再是pointer类型,而是被一个alloc_proxy封装起来,不过总的来说还是得重新分配内存,而且reserve后的capacity就是参数__n.

    同时把原有元素拷贝过去.这里额外提一下,vector<t>()默认构造capacity==0,是没有分配空间的.而vector<t>(size_type n,const T&) size==capacity,同时迭代器失效也是当然.

  • 相关阅读:
    idea 快捷键 记录
    Spring Boot 之注解@Component @ConfigurationProperties(prefix = "sms") 使用@ConfigurationProperties读取yml配置
    SpringData Jdbc
    设备树中指定的中断触发方式与request_irq中指定的触发方式不一致时,内核会使用哪种中断触发方式呢?
    设备树中的interrupts属性解析
    编译grub时报告"grub_script.yy.c:19:22: error: statement with no effect [-Werror=unused-value]"怎么处理?
    uefi是如何启动linux内核的?
    markdown中如何设置字体为红色?
    linux下如何查看磁盘分区所使用的文件系统格式?
    bootargs中的rootwait 与rootdelay有什么区别?
  • 原文地址:https://www.cnblogs.com/cavehubiao/p/3656785.html
Copyright © 2020-2023  润新知