vector C++(一)

				版权声明:本文为博主原创文章,未经博主允许不得转载。	

			https://blog.csdn.net/sangyongjia/article/details/51122965				</div>

       使用STL的三个境界:能用,明理,能扩展。本文属于第一个境界,如果结合了《STL源码解析》,则达到了第二个境界,如果项目中有需要,对STL进行了扩展则就达到了第三个境界!如果希望深刻理解vector的这些个成员函数,最好的办法是详细了解其内部实现,《STL源码解析》是个好途径!当然,也可以直接看编译器自带的<vector>的源码。

       vector是C++标准模板库中的部分内容,vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组。
       为了使用vector,必须包含头文件<vector>。另,vector属于std命名空间,因此需要通过命名限定,可以有如下三种方式,后两种方式更好,因为未引入的无关的内容。(依稀记的《Effective C++》的某个条款这个提过!)
using namespace std;
using namespace std::vector;
std::vector<int> vec;


现在以 std::vector<int> vec为例,描述相关函数的功能!

第一部分:


 
 
  1. vec.begin() //指向迭代器中第一个元素。
  2. vec.end() //指向迭代器中末端元素的下一个,指向一个不存在元素。
  3. vec.push_back(elem) //在尾部加入一个数据。
  4. vec.pop_back() //删除最后一个数据。
  5. vec.capacity() //vector可用空间的大小。
  6. vec.size() //返回容器中数据个数。
  7. vec.empty() //判断容器是否为空。
  8. vec.front() //传回第一个数据。
  9. vec.back() //传回最后一个数据,不检查这个数据是否存在。
  10. vec.at(index) //传回索引idx所指的数据,如果idx越界,抛出out_of_range。
  11. vec.clear() //移除容器中所有数据。
  12. vec.erase(iterator) //删除pos位置的数据,传回下一个数据的位置。
  13. vec.erase(begin,end) //删除[beg,end)区间的数据,传回下一个数据的位置。注意:begin和end为iterator
  14. vec.insert(position,elem) //在pos位置插入一个elem拷贝,传回新数据位置。
  15. vec.insert(position,n,elem) //在pos位置插入n个elem数据,无返回值。
  16. vec.insert(position,begin,end) //在pos位置插入在[beg,end)区间的数据,无返回值。

以下代码验证上述这些常用函数的功能:


 
 
  1. #include<vector>
  2. #include<iostream>
  3. using namespace std;
  4. int main()
  5. {
  6. vector< int> vec( 3, 0);
  7. vector< int>::iterator iter;
  8. vector< int>::iterator begin=vec.begin();
  9. vector< int>::iterator end=vec.end();
  10. cout<< "vec:";
  11. for(iter=begin; iter!=end; iter++)
  12. {
  13. static std:: size_t i= 0;
  14. cout<<*iter<< ",";
  15. i++;
  16. }
  17. cout<< endl;
  18. cout<< "size:"<<vec.size()<< endl;
  19. cout<< "capacity:"<<vec.capacity()<< endl;
  20. //
  21. cout<< endl;
  22. vec.push_back( 1);
  23. vec.push_back( 2);
  24. begin=vec.begin();
  25. end=vec.end();
  26. cout<< "push back 1 and 2 based on above;vec:";
  27. for(iter=begin; iter!=end; iter++)
  28. {
  29. static std:: size_t j= 0;
  30. cout<<*iter<< ",";
  31. j++;
  32. }
  33. cout<< endl;
  34. cout<< "size:"<<vec.size()<< endl;
  35. cout<< "capacity:"<<vec.capacity()<< endl;
  36. //
  37. cout<< endl;
  38. vec.pop_back();
  39. begin=vec.begin();
  40. end=vec.end();
  41. cout<< "pop one element based on above;vec:";
  42. for(iter=begin; iter!=end; iter++)
  43. {
  44. static std:: size_t k= 0;
  45. cout<<*iter<< ",";
  46. k++;
  47. }
  48. cout<< endl;
  49. cout<< "size:"<<vec.size()<< endl;
  50. cout<< "capacity:"<<vec.capacity()<< endl;
  51. /
  52. begin=vec.begin();
  53. end=vec.end();
  54. cout<< endl;
  55. if(vec.empty())
  56. {
  57. cout<< "vec is empty"<< endl;
  58. }
  59. else
  60. {
  61. cout<< "vec is not empty"<< endl;
  62. }
  63. /
  64. cout<< endl;
  65. cout<< "based on the above:"<< endl;
  66. cout<< " vec.front():"<<vec.front()<< endl;
  67. cout<< " vec.back():"<<vec.back()<< endl;
  68. begin=vec.begin();
  69. end=vec.end();
  70. cout<< " size:"<<vec.size()<< endl;
  71. cout<< " capacity:"<<vec.capacity()<< endl;
  72. cout<< "vec:";
  73. for(iter=begin; iter!=end; iter++)
  74. {
  75. static std:: size_t l= 0;
  76. cout<<*iter<< ",";
  77. l++;
  78. }
  79. cout<< endl;
  80. cout<< endl;
  81. cout<< "call at(),based on the above:"<< endl;
  82. cout<< " vec.at():"<<vec.at( 3)<< endl;
  83. begin=vec.begin();
  84. end=vec.end();
  85. cout<< " size:"<<vec.size()<< endl;
  86. cout<< " capacity:"<<vec.capacity()<< endl;
  87. cout<< "vec:";
  88. for(iter=begin; iter!=end; iter++)
  89. {
  90. static std:: size_t m= 0;
  91. cout<<*iter<< ",";
  92. m++;
  93. }
  94. cout<< endl;
  95. //
  96. cout<< endl;
  97. cout<< "call clear(),based on the above:"<< endl;
  98. vec.clear();
  99. begin=vec.begin();
  100. end=vec.end();
  101. cout<< " size:"<<vec.size()<< endl;
  102. cout<< " capacity:"<<vec.capacity()<< endl;
  103. cout<< "vec:";
  104. for(iter=begin; iter!=end; iter++)
  105. {
  106. static std:: size_t m= 0;
  107. cout<<*iter<< ",";
  108. m++;
  109. }
  110. cout<< endl;
  111. //
  112. cout<< endl;
  113. for( int i= 1;i< 8;i++)
  114. {
  115. vec.push_back(i);
  116. }
  117. cout<< "push_back 1,2,3,4,5,6,7 based on above;vec:";
  118. begin=vec.begin();
  119. end=vec.end();
  120. for(iter=begin; iter!=end; iter++)
  121. {
  122. static std:: size_t m= 0;
  123. cout<<*iter<< ",";
  124. m++;
  125. }
  126. cout<< endl;
  127. vec.erase(vec.begin()+ 2);
  128. cout<< "call vec.erase(3),vec:";
  129. begin=vec.begin();
  130. end=vec.end();
  131. for(iter=begin; iter!=end; iter++)
  132. {
  133. static std:: size_t m= 0;
  134. cout<<*iter<< ",";
  135. m++;
  136. }
  137. cout<< endl;
  138. cout<< " size:"<<vec.size()<< endl;
  139. cout<< " capacity:"<<vec.capacity()<< endl;
  140. //
  141. cout<< endl;
  142. vec.erase(vec.begin()+ 1,vec.begin()+ 3);
  143. cout<< "call vec.erase(1,3),vec:";
  144. begin=vec.begin();
  145. end=vec.end();
  146. for(iter=begin; iter!=end; iter++)
  147. {
  148. static std:: size_t m= 0;
  149. cout<<*iter<< ",";
  150. m++;
  151. }
  152. cout<< endl;
  153. cout<< " size:"<<vec.size()<< endl;
  154. cout<< " capacity:"<<vec.capacity()<< endl;
  155. return 1;<span style= "font-family: Arial, Helvetica, sans-serif;">}</span>

输出结果如下:


vector中v[i]与v.at(i)的区别:参见:http://www.cnblogs.com/zhuyf87/archive/2012/12/06/2805579.html


 
 
  1. void f(vector<int> &v)
  2. {
  3. v[ 0]; // A
  4. v.at[ 0]; // B
  5. }

      如果v非空,A行和B行没有任何区别。如果v为空,B行会抛出std::out_of_range异常,A行的行为未定义。
      c++标准不要求vector<T>::operator[]进行下标越界检查,原因是为了效率,总是强制下标越界检查会增加程序的性能开销。设计vector是用来代替内置数组的,所以效率问题也应该考虑。不过使用operator[]就要自己承担越界风险了。如果需要下标越界检查,请使用at。

第二部分:


 
 
  1. assign函数原型及功能:
  2. void assign(const_iterator first,const_iterator last); //功能:将区间[first,last)的元素赋值到当前的vector中,当前vector会清除掉容器中之前的内容。
  3. void assign(size_type n,const T& x = T()); //功能:赋n个值为x的元素到当前vector中,当前vector会清除掉容器中之前的内容。

以下函数验证assign函数的功能:


 
 
  1. #include <vector>
  2. #include <iostream>
  3. using namespace std;
  4. int main( )
  5. {
  6. vector< int> v1, v2, v3;
  7. vector< int>::iterator iter;
  8. for( int i= 10; i< 60; i+= 10)
  9. {
  10. v1.push_back(i);
  11. }
  12. v2.push_back( 1);
  13. v2.push_back( 2);
  14. cout << "v1 = " ;
  15. for (iter = v1.begin(); iter != v1.end(); iter++)
  16. {
  17. cout << *iter << " ";
  18. }
  19. cout << endl;
  20. cout << "v2 = ";
  21. for (iter = v2.begin(); iter != v2.end(); iter++)
  22. cout << *iter << " ";
  23. cout << endl;
  24. v1.assign(v2.begin(), v2.end());
  25. cout << "v2 = ";
  26. for (iter = v2.begin(); iter != v2.end(); iter++)
  27. cout << *iter << " ";
  28. cout << endl;
  29. v3=v1;
  30. v3.assign( 4, 3) ;
  31. cout << "v3 = ";
  32. for (iter = v3.begin(); iter != v3.end(); iter++)
  33. cout << *iter << " ";
  34. cout << endl;
  35. return 0;
  36. }
运行结果如下:

第三部分:


 
 
  1. vec.rbegin() //传回一个vector的最后一个数据的指针。
  2. vec.rend() // 传回一个vector的第一个数据前一个位置的指针。?
验证代码如下:

 
 
  1. #include <vector>
  2. #include <iostream>
  3. using namespace std;
  4. int main( )
  5. {
  6. vector< int> v1, v2, v3;
  7. vector< int>::iterator iter;
  8. for( int i= 10; i< 60; i+= 10)
  9. {
  10. v1.push_back(i);
  11. }
  12. v2.push_back( 1);
  13. v2.push_back( 2);
  14. cout << "v1 = " ;
  15. for (iter = v1.begin(); iter != v1.end(); iter++)
  16. {
  17. cout << *iter << " ";
  18. }
  19. cout << endl;
  20. cout << "v2 = ";
  21. for (iter = v2.begin(); iter != v2.end(); iter++)
  22. cout << *iter << " ";
  23. cout << endl;
  24. vector< int>::reverse_iterator r_iter;
  25. cout << "v1 in reverse ";
  26. for (r_iter = v1.rbegin(); r_iter != v1.rend(); r_iter++)
  27. cout << *r_iter << " ";
  28. cout << endl;
  29. cout<< "v1.rbegin():"<<*v1.rbegin()<< endl;
  30. cout<< "v1.rbegin():"<<(*(v1.rbegin()--))<< endl;
  31. cout<< "v1.rend()--:"<<*(v1.rend()--)<< endl;
  32. cout<< "v1.rend()++:"<<*(v1.rend()++)<< endl;
  33. return 0;
  34. }
输出结果为:



        此处有个疑问:对(*(v1.rbegin()++))、(*(v1.begin()++))、(*(v1.rbegin()--))、(*(v1.begin()--))均没达到预期,需要看下其内部究竟是怎么实现的!

        另外,注意:企图直接打印迭代器,编译是通不过的!eg:cout<< v1.begin();

第四部分:


  
  
  1. vec.resize(num) //重新指定vector的长度。
  2. vec.resize(num,value) //重新指定vector的长度。并设定新增的元素的值
当需要以vec[size+1]=vec[j];的方式对超过vector的size赋值时,都需要先调用下resize()函数,如果直接对超出vector.size()的位置赋值,编译不能通过!
如上所示,一种是仅仅设定size,另一种即设定size也设定value;其实resize函数就是重新设定finish指针。如果在调用resize函数时,发现vector没有剩余的空间了,则会以当前的size为基础,申请开辟2倍的空间。(开辟空间,拷贝,释放原有空间的过程)

第五部分:


  
  
  1. vec.swap(vec1) //
  2. swap(vec,vec1) //


  
  

  
  
  1. #include<vector>
  2. #include<iostream>
  3. using namespace std;
  4. int main()
  5. {
  6. vector< int> vec( 3, 0);
  7. vector< int>::iterator iter;
  8. vector< int>::iterator begin=vec.begin();
  9. vector< int>::iterator end=vec.end();
  10. cout<< "vec:";
  11. for(iter=begin; iter!=end; iter++)
  12. {
  13. static std:: size_t i= 0;
  14. cout<<*iter<< ",";
  15. i++;
  16. }
  17. cout<< endl;
  18. vec.push_back( 7);
  19. cout<< "size:"<<vec.size()<< endl;
  20. cout<< "capacity:"<<vec.capacity()<< endl;
  21. vector< int>(vec).swap(vec);
  22. cout<< "vector<int>(vec)-swap-capacity:"<<vec.capacity()<< endl;
  23. cout<< "vector<int>(vec)-swap-size:"<<vec.size()<< endl;
  24. {
  25. vector< int> temp(vec);
  26. temp.swap(vec);
  27. cout<< "temp-swap-capacity:"<<vec.capacity()<< endl;
  28. cout<< "temp-swap-size:"<<vec.size()<< endl;
  29. }
  30. vector< int>().swap(vec);
  31. cout<< "vector<int>()-swap-capacity:"<<vec.capacity()<< endl;
  32. cout<< "vector<int>()-swap-size:"<<vec.size()<< endl;
  33. return 1;
  34. }
输出结果为:



 
 
  1. #include<vector>
  2. #include<iostream>
  3. #include<algorithm>
  4. using namespace std;
  5. int main()
  6. {
  7. vector< int> vec( 3, 0);
  8. vector< int>::iterator iter;
  9. vector< int>::iterator begin=vec.begin();
  10. vector< int>::iterator end=vec.end();
  11. cout<< "vec:";
  12. for(iter=begin; iter!=end; iter++)
  13. {
  14. static std:: size_t i= 0;
  15. cout<<*iter<< ",";
  16. i++;
  17. }
  18. cout<< endl;
  19. vec.push_back( 7);
  20. cout<< "vec size:"<<vec.size()<< endl;
  21. cout<< "vec capacity:"<<vec.capacity()<< endl;
  22. vector< int> vec1( 3, 1);
  23. vec1.push_back( 6);
  24. cout<< "vec1 size:"<<vec1.size()<< endl;
  25. cout<< "vec1 capacity:"<<vec1.capacity()<< endl;
  26. swap(vec,vec1);
  27. begin=vec.begin();
  28. end=vec.end();
  29. cout<< "after swap vec:";
  30. for(iter=begin; iter!=end; iter++)
  31. {
  32. cout<<*iter<< ",";
  33. }
  34. cout<< "vec size after swap():"<<vec.size()<< endl;
  35. cout<< "vec capacity after swap():"<<vec.capacity()<< endl;
  36. begin=vec1.begin();
  37. end=vec1.end();
  38. cout<< "after swap vec1:";
  39. for(iter=begin; iter!=end; iter++)
  40. {
  41. cout<<*iter<< ",";
  42. }
  43. cout<< "vec1 size after swap():"<<vec1.size()<< endl;
  44. cout<< "vec1 capacity after swap():"<<vec1.capacity()<< endl;
  45. return 0;
  46. }
输出结果为:

该结果表明<algorithm>中的函数swap(),只是交换两个vector中的内容,其原本的size和capacity均不做改变!

vec.reserve()//设定capacity的值,如果小于原本的capacity的值则保持为原本的capacity的值。
 
 

以下为显而易见的操作:
operator[]://此函数返回的是容器中指定位置的一个引用。
operattor*://指针的取址操作

若干种创建方式(vector的构造函数)
vector<type> vec
vector<type> vec(vec1)
vector<type> vec=vec1
vector<type> vec(n)
vector<type> vec(n,elem)
vector<type> vec(begin,end)
vector<type> vec{a,b,c,……}
vector<type> vec={a,b,c,……}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值