• 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  
  • 相关阅读:
    vector常规用法(leedcode)
    creaor小游戏数据表配置引发的相关问题
    cocos2dx conversion to dalvik format failed
    Java中如何实现列表对象(List)的灵活查找?/java中Listgen根据某个元素获取对象
    MySql忘记root用户密码
    命令行模式下备份和恢复mysql数据库
    mysql开启日志
    Python操作Excel文件
    Python操作Json文件
    Python操作xml文件
  • 原文地址:https://www.cnblogs.com/duyy/p/3581059.html
Copyright © 2020-2023  润新知