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  
原文地址:https://www.cnblogs.com/duyy/p/3581059.html