STL学习笔记----3.容器 vector 和 deque

容器的 vector 和 deque,在操作方面比较相似,所以放在一起总结。除了共通操作外,它们还有自己的一些特点,具体如下:

一. vector

vector 模塑出来一个动态数组,在末端添加和删除元素时,性能相当好,在前端或中部插入或删除元素时,性能不怎么样。

1. vector 的容量

vector 性能优异的原因是,就是分配了比其所容纳元素所需的,更多的内存空间。有两个函数要特别注意一下:

[cpp]  view plain copy
  1. v.capacity;  //返回 vector 实际能够容纳的元素数量  
这个容量值是当前所能容纳的最大值,这个 值是会的,当超过当前最大容量时 vector 就会重新配置内部存储空间。

容量一但分配,就不会缩减。

[cpp]  view plain copy
  1. //仅分配空间,size 是不变的  
  2. v.reserve();  
  3.   
  4. //下面两种方式是一样的。不过第一种方法只分配空间,而第二种方法还要调用构造函数  
  5. vector<int> v;  
  6. v.reserve(80);  
  7.   
  8. vector<int> v(80); //如果构造函数很耗时,那么推荐使用上面的方法  
如果容量不足,则扩大;如果调用所给的参数 比当前 vector 的容量小,不会引发任何反应

2. vector 的操作

元素存取

[cpp]  view plain copy
  1. //返回索引 idx 所标示的元素。如果idx越界,抛出out_of_range。只有这个是进行范围检查的。  
  2. v.at(idx);  
  3.   
  4. //返回索引 idx 所标示的元素。不进行范围检查  
  5. v[idx];   
  6.   
  7. //返回第一个元素。不检查第一个元素是否存在  
  8. v.front();  
  9.   
  10. //返回最后一个元素。不检查最后一个元素是否存在  
  11. v.back();  

插入与删除

[cpp]  view plain copy
  1. //在尾部添加和删除一个elem,无返回  
  2. v.push_back(elem);  
  3. v.pop_back();  
  4.   
  5. //移除pos位置上的元素,返回下一元素的位置  
  6. v.erase(pos);  
  7.   
  8. //将元素数量改为num。  
  9. //如果 num < 当前 size,则后面的元素被置为空。  
  10. //如果 num > 当前 size,多出来的新元素都以default/elem构造完成  
  11. v.resize(num);  
  12. v.resize(num,elem)  

3. vector 当成数组

大多数情况下,可以把 vector 当成数组来用。

但是,千万不要把迭代器当做第一元素的地址来传递,vector 迭代器是由实现版本定义的,也许并不是一个指针。

[cpp]  view plain copy
  1. printf("%s\n", v.begin());  //Error, might work, but not portable    
  2. printf("%s\n", &v[0]);      //OK    


二. deque

deque也采用动态数组来管理元素,提供随机存取,与vector非常相似。不同的是deque的动态数组头尾都开放,因此能在头尾两端进行快速安插和删除。


操作上与 vector 基本一样,但是多了几个操作:

[cpp]  view plain copy
  1. //在头部添加和删除一个elem,无返回  
  2. v.push_front(elem);  
  3. v.pop_front();  

注意:

deque 不提供容量操作 capacity() 和 reserve()。

三. 迭代器无效

1. vector 插入或删除操作会使“作用点”之后的各元素的pointers, references和iterators失效,如果插入操作引发内存重新分配,那么容器上所有的pointers, references和iterators都将失效

2. deque 插入或删除都可能引起内存重新分配,所以任何插入或删除动作都会使所有指向 deque元素的 pointers, references 和 iterators 失效。

所以在插入或删除操作之后,要重新对 pointers, references和iterators 进行赋值的值。

四. 代码举例

[cpp]  view plain copy
  1. #include <iostream>  
  2. #include <string>  
  3. #include <vector>  
  4. using namespace std;  
  5.   
  6.   
  7. int main(int argc, char* argv[])  
  8. {  
  9.     //create empty vector for strings  
  10.     vector<string> sentence;  
  11.       
  12.     //开辟一个能容纳5个元素的空间,size 可没变  
  13.     sentence.reserve(5);  
  14.       
  15.     //append some elements  
  16.     sentence.push_back("Hello,");  
  17.     sentence.push_back("how");  
  18.     sentence.push_back("are");  
  19.     sentence.push_back("you");  
  20.     sentence.push_back("?");  
  21.       
  22.     //打印  
  23.     copy (sentence.begin(), sentence.end(),  
  24.         ostream_iterator<string>(cout," "));  
  25.     cout << endl;  
  26.       
  27.     //print ''technical data''  
  28.     cout << " max_size(): " << sentence.max_size() << endl;  
  29.     cout << " size():     " << sentence.size()     << endl;  
  30.     cout << " capacity(): " << sentence.capacity() << endl;  
  31.       
  32.     //swap second and fourth element  
  33.     swap (sentence[1], sentence [3]);  
  34.       
  35.     //使用迭代器  
  36.     vector<string>::iterator it1 = sentence.begin();  
  37.     vector<string>::iterator it2 = sentence.end();  
  38.   
  39.     cout<<*it1<<endl;  
  40.     cout<<*(it2-1)<<endl;  
  41.   
  42.     //在 "?" 前插入元素 "always"  
  43.     sentence.insert (find(sentence.begin(),sentence.end(),"?"),  
  44.         "always");  
  45.       
  46.     //引发迭代器无效,要崩溃!!!!!!!!!!!!!!!!!!!!!!!!!!!  
  47.     cout<<*it1<<endl;  
  48.     cout<<*(it2-1)<<endl;  
  49.   
  50.     //assign "!" to the last element  
  51.     sentence.back() = "!";  
  52.       
  53.     //print elements separated with spaces  
  54.     copy (sentence.begin(), sentence.end(),  
  55.         ostream_iterator<string>(cout," "));  
  56.     cout << endl;  
  57.       
  58.   
  59.     //print "technical data" again  
  60.     cout << " max_size(): " << sentence.max_size() << endl;  
  61.     cout << " size():     " << sentence.size()     << endl;  
  62.     cout << " capacity(): " << sentence.capacity() << endl; //自动变了!!  
  63.   
  64.     return 0;  
  65. }  

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值