久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

vector 詳細用法 C++-CSDN博客

 wuxinit_ 2023-11-07 發(fā)布于湖北

       使用STL的三個境界:能用,明理,,能擴展,。本文屬于第一個境界,如果結(jié)合了《STL源碼解析》,,則達到了第二個境界,如果項目中有需要,對STL進行了擴展則就達到了第三個境界,!如果希望深刻理解vector的這些個成員函數(shù),最好的辦法是詳細了解其內(nèi)部實現(xiàn),,《STL源碼解析》是個好途徑,!當然,也可以直接看編譯器自帶的<vector>的源碼,。

       vector是C++標準模板庫中的部分內(nèi)容,,vector之所以被認為是一個容器,是因為它能夠像容器一樣存放各種類型的對象,,簡單地說,,vector是一個能夠存放任意類型的動態(tài)數(shù)組。
       為了使用vector,,必須包含頭文件<vector>,。另,vector屬于std命名空間,,因此需要通過命名限定,,可以有如下三種方式,后兩種方式更好,,因為未引入的無關(guān)的內(nèi)容,。(依稀記的《Effective C++》的某個條款這個提過!)
using namespace std;
using namespace std::vector;
std::vector<int> vec;


現(xiàn)在以 std::vector<int> vec為例,,描述相關(guān)函數(shù)的功能,!

第一部分:

  1. vec.begin()//指向迭代器中第一個元素。
  2. vec.end()//指向迭代器中末端元素的下一個,,指向一個不存在元素,。
  3. vec.push_back(elem) //在尾部加入一個數(shù)據(jù)。
  4. vec.pop_back() //刪除最后一個數(shù)據(jù),。
  5. vec.capacity() //vector可用空間的大小,。
  6. vec.size()//返回容器中數(shù)據(jù)個數(shù)。
  7. vec.empty() //判斷容器是否為空,。
  8. vec.front() //傳回第一個數(shù)據(jù),。
  9. vec.back() //傳回最后一個數(shù)據(jù),不檢查這個數(shù)據(jù)是否存在,。
  10. vec.at(index) //傳回索引idx所指的數(shù)據(jù),,如果idx越界,,拋出out_of_range。
  11. vec.clear() //移除容器中所有數(shù)據(jù),。
  12. vec.erase(iterator) //刪除pos位置的數(shù)據(jù),,傳回下一個數(shù)據(jù)的位置。
  13. vec.erase(begin,end) //刪除[beg,end)區(qū)間的數(shù)據(jù),,傳回下一個數(shù)據(jù)的位置,。注意:begin和end為iterator
  14. vec.insert(position,elem) //在pos位置插入一個elem拷貝,傳回新數(shù)據(jù)位置,。
  15. vec.insert(position,n,elem) //在pos位置插入n個elem數(shù)據(jù),,無返回值。
  16. vec.insert(position,begin,end) //在pos位置插入在[beg,end)區(qū)間的數(shù)據(jù),,無返回值,。

以下代碼驗證上述這些常用函數(shù)的功能:
  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>

輸出結(jié)果如下:


vector中v[i]與v.at(i)的區(qū)別:參見: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行沒有任何區(qū)別,。如果v為空,,B行會拋出std::out_of_range異常,A行的行為未定義,。
      c++標準不要求vector<T>::operator[]進行下標越界檢查,,原因是為了效率,總是強制下標越界檢查會增加程序的性能開銷,。設計vector是用來代替內(nèi)置數(shù)組的,所以效率問題也應該考慮,。不過使用operator[]就要自己承擔越界風險了,。如果需要下標越界檢查,請使用at,。

第二部分:

  1. assign函數(shù)原型及功能:
  2. void assign(const_iterator first,const_iterator last); //功能:將區(qū)間[first,last)的元素賦值到當前的vector中,,當前vector會清除掉容器中之前的內(nèi)容。
  3. void assign(size_type n,const T& x = T()); //功能:賦n個值為x的元素到當前vector中,,當前vector會清除掉容器中之前的內(nèi)容,。

以下函數(shù)驗證assign函數(shù)的功能:

  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. }
運行結(jié)果如下:

第三部分:

  1. vec.rbegin()//傳回一個vector的最后一個數(shù)據(jù)的指針。
  2. vec.rend()// 傳回一個vector的第一個數(shù)據(jù)前一個位置的指針,。,?
驗證代碼如下:
  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. }
輸出結(jié)果為:



        此處有個疑問:對(*(v1.rbegin()++))、(*(v1.begin()++)),、(*(v1.rbegin()--)),、(*(v1.begin()--))均沒達到預期,需要看下其內(nèi)部究竟是怎么實現(xiàn)的,!

        另外,,注意:企圖直接打印迭代器,,編譯是通不過的!eg:cout<< v1.begin();

第四部分:

  1. vec.resize(num)//重新指定vector的長度,。
  2. vec.resize(num,value)//重新指定vector的長度,。并設定新增的元素的值
當需要以vec[size+1]=vec[j];的方式對超過vector的size賦值時,都需要先調(diào)用下resize()函數(shù),,如果直接對超出vector.size()的位置賦值,,編譯不能通過!
如上所示,,一種是僅僅設定size,,另一種即設定size也設定value;其實resize函數(shù)就是重新設定finish指針。如果在調(diào)用resize函數(shù)時,,發(fā)現(xiàn)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. }
輸出結(jié)果為:


  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. }
輸出結(jié)果為:

該結(jié)果表明<algorithm>中的函數(shù)swap(),,只是交換兩個vector中的內(nèi)容,,其原本的size和capacity均不做改變!

vec.reserve()//設定capacity的值,,如果小于原本的capacity的值則保持為原本的capacity的值,。

以下為顯而易見的操作:
operator[]://此函數(shù)返回的是容器中指定位置的一個引用。
operattor*://指針的取址操作

若干種創(chuàng)建方式(vector的構(gòu)造函數(shù))
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,……}

    本站是提供個人知識管理的網(wǎng)絡存儲空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導購買等信息,,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請點擊一鍵舉報,。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多