zoukankan      html  css  js  c++  java
  • vector

    1. 空间运用灵活性

           vector与数组的唯一差别就在于空间运用的灵活性。vector的空间是可以动态增长的(但是不能减小)。需要空间运用的灵活性,vector就必须引入空间增长的机制,相应的也会有一些属性和接口。如下图:

    2. vector的操作:push_back, pop_back, resize, reserve,erase, clear, insert,swap,assign

           另外的一些基础常用的操作就略过了。

    2.1. push_back

           在元素的尾端插入,也就是finish(end()操作的返回值)所指之处。如果空间不够(finsh=end_of_storage)的话那么新开辟一块2倍于现在大小的空间,将vector复制过去后再进行插入。

    2.2. pop_back

    [cpp] view plaincopy
     
    1. void pop_back()  
    2. {  
    3.        --finish;  
    4.        destroy(finish);  
    5. }  

    2.3. resize

           resize操作是用来改变已用空间的大小的,而不是总的分配空间的大小。

    [cpp] view plaincopy
     
    1. void resize(size_type new_size, constT& x) {  
    2.    if (new_size < size())  
    3.      erase(begin() + new_size, end());  
    4.    else  
    5.      insert(end(), new_size - size(), x);  
    6.   }  
    7.  void resize(size_typenew_size) { resize(new_size, T()); }  
    8.   // 清除全部元素。注意,并未释放空间(其实vector的空间是不可能减小的)。  

    2.4. reserve

    [cpp] view plaincopy
     
    1. void reserve(size_typen)  
    2. {  
    3. if (capacity()< n) //如果capacity比n大就不会有任何操作,不要指望减小vector的空间  
    4. {  
    5.      const size_type old_size = size();  
    6.      iterator tmp = allocate_and_copy(n, start, finish);  
    7.      destroy(start, finish);  
    8.      deallocate();  
    9.      start = tmp;  
    10.      finish = tmp + old_size;  
    11.      end_of_storage = start + n;  
    12.     }  
    13.  }  

    2.5. erase

    [cpp] view plaincopy
     
    1. //将迭代器position所指元素移除  
    2. iterator erase(iterator position)  
    3. {  
    4.    if (position + 1 != end()) // 如果p 不是指向最后一个元素  
    5.      // 将p之后的元素一一前移  
    6.      copy(position + 1, finish, position);  
    7.    --finish;  
    8.     destroy(finish);  
    9.     return position;  
    10. }  
    11. //迭代器范围版本  
    12. iterator erase(iterator first, iterator last)  
    13. {  
    14.    iterator i = copy(last, finish, first);  
    15.     destroy(i,finish);  
    16.    finish = finish - (last - first);  
    17.    return first;  
    18. }  

           注意erase的核心操作时copy算法。

    2.6. clear

           clear就是调用erase操作。

    [cpp] view plaincopy
     
    1. void clear(){ erase(begin(), end()); }  

    2.7. insert

           需要频繁调用insert的时候应该采用list,但是vector也提供insert操作。

    2.8. swap

           swap是所有顺序容器都提供的操作。就是交换两容器的存储内容,不过这里的交换并不是真的将存储内容交换,而是交换一些结构参数而已。

    [cpp] view plaincopy
     
    1. void swap(vector<T, Alloc>& x)  
    2. {  
    3.    __STD::swap(start, x.start);  
    4.    __STD::swap(finish, x.finish);  
    5.    __STD::swap(end_of_storage, x.end_of_storage);  
    6. }  

           这样swap就很有效率了。从上面的代码来看,我搞不懂为什么Primer上说swap后迭代器不失效。

    2.9. assign

           assign操作也是顺序容器共有的操作,两种接口:

    c.assign(b,e)——重新设置c,内容为迭代器b,e之间元素

    c.assign(n,t)——重新设置c,内容为n个t

           第一个接口,提供了不同容器之间的赋值,当然前提是存储的元素类型相同。比如:

    [cpp] view plaincopy
     
      1. std::list<std::string> ls;  
      2. ……..  
      3. std::deque<std::string> de;  
      4. de.assign(ls.begin(),ls.end());//把list assign到deque  
  • 相关阅读:
    Rainmeter 雨滴桌面 主题分享
    行人检測之HOG特征(Histograms of Oriented Gradients)
    const和readonly差别
    ADB命令解析
    Java实现 蓝桥杯VIP 算法训练 接水问题
    Java实现 蓝桥杯VIP 算法训练 星际交流
    Java实现 蓝桥杯VIP 算法训练 星际交流
    Java实现 蓝桥杯VIP 算法训练 星际交流
    Java实现 蓝桥杯VIP 算法训练 星际交流
    Java实现 蓝桥杯VIP 算法训练 星际交流
  • 原文地址:https://www.cnblogs.com/duyy/p/3581059.html
Copyright © 2011-2022 走看看