91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++ vector使用的一些注意事項

發布時間:2020-09-24 13:06:24 來源:腳本之家 閱讀:236 作者:Leehm 欄目:編程語言

1. 初始化

       c++ 11以后新增了大括號{}的初始化方式,需要注意與()的區別,如:

         std::vector<int> vecTest1(5);         //初始化5個元素,每個都是0

         std::vector<int> vecTest2{ 5 };       //初始化1個元素,值是5

C++ vector使用的一些注意事項 

2.  添加元素:push_back

       通過push_back添加新的元素進入vector后,vector的內存有時候會發生變化,這取決于size和capacity大小,當然這些都是系統來處理的,詳細可以參考stl源碼

        當size<capacity的時候,直接加到末尾,不會變化

        當size==capacity的時候,會重新申請另外一塊內存,然后copy過去加到尾部,這個時候就會有變化了。

        對于stl的容器,都有成員:

                 begin()  //起始位置

                 end() //結束位置

                 size() //當前大小

         capacity() //當前容量,即已申請的內存大小

     vector是一段連續的內存空間,有三個標識內存的位置,start,end,finish, size=end-start, capacity=finish-start

     很多時候在使用vector的時候,會看到size=capacity,這個時候直接添加元素到尾部,內存明顯是不夠的,此時會重新在別處分配一塊大小足夠

     有時候也有size<capacity, 這個時候就直接加在尾部了。

std::cout << "vecNum push back init" << std::endl;
vector<int> vecNum(5);
std::cout << "vecNum addr: " << &vecNum << std::endl;
for(auto i = 5; i < 10; i++)
{
 vecNum.push_back(i*10);
 std::cout << "vecNum push_back(" << i << ")=" << i*10 << std::endl;
 
 std::cout << "vecNum.size() = " << vecNum.size() << ",vecNum.capacity() = " << vecNum.capacity() << std::endl;
 std::cout << "vecNum.begin() addr: " << &(*vecNum.begin()) << std::endl;
}
std::cout << "vecNum addr: " << &vecNum << std::endl;

3. 關于earse和remove

     erase返回的是當前刪除的元素的一下個位置的迭代器,所以需要注意的是遍歷時候的++運算,這個與其它list,map差不多,

    需要注意的earse后內存并未真正的清空,僅僅是刪除內容,真正的容量大小capacity并沒有改變,需要通過swap來實現capacity的減小

     全部清空可以考慮:vector<int>().swap(vecNum);

auto itor = vecNum.begin();
for( ; itor != vecNum.end(); )
{
 auto num = *itor;
 if(num == 60)
 {
 itor = vecNum.erase(itor);
 break;
 }
 else
 {
 itor++;
 }
}

 std::cout << "after erase element 60:" << std::endl;
 printVector(vecNum);
 vector<int>(vecNum).swap(vecNum); //將vecNum的內存空洞清除
 printVector(vecNum);

C++ vector使用的一些注意事項

      //remove只是通過迭代器的指針向前移動來刪除,將不需要刪除的元素往前移,因此需要刪除的就都在尾部了

      //返回新的指向尾部需要刪除的元素的迭代器

      因此還是得配合earse來使用,所以一般真要刪除,建議直接遍歷使用earse

auto itor = remove_if(vecNum.begin(), vecNum.end(),[](int x)->bool{ return x == 20; });
//or
//auto itor = remove(vecNum.begin(), vecNum.end(),20);
 
//通過erase刪除
vecNum.erase(itor, vecNum.end());

4. 關于vector< bool>  -- 慎用

       出處: https://www.jb51.net/article/167636.htm

       vector< bool> 并不是一個STL容器,不是一個STL容器,不是一個STL容器!

       首先vector< bool> 并不是一個通常意義上的vector容器,這個源自于歷史遺留問題。

早在C++98的時候,就有vector< bool>這個類型了,但是因為當時為了考慮到節省空間的想法,所以vector< bool>里面不是一個Byte一個Byte儲存的,它是一個bit一個bit儲存的!

因為C++沒有直接去給一個bit來操作,

    所以用operator[]的時候, 正常容器返回的應該是一個對應元素的引用,

   但是對于vector< bool>實際上訪問的是一個”proxy reference”而不是一個”true reference”,返回的是”std::vector< bool>:reference”類型的對象。

   因此,使用auto自動類型推導時會出現問題

//vector<bool>慎用
	vector<bool> vecBool = { false, true, false };
	bool test1 = vecBool[0]; 
	auto test2 = vecBool[1];
	test1 = true; //test1的初始化它其實暗含了一個隱式的類型轉換(直接對vecBool[0]賦值會修改vecBool中的值,但是對test1不會)
	test2 = false; //test2它的類型并不是bool,而是一個vector< bool>中的一個內部類,而此時如果修改test2的值,vecBool中的值也會跟著修改
	auto index = 0;
	for (auto i : vecBool)
	{
 cout << "vecBool[" << index << "]" << i << std::endl;
 index++;
	}

C++ vector使用的一些注意事項

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

奉节县| 浦北县| 纳雍县| 隆化县| 衢州市| 曲水县| 临邑县| 太仓市| 墨脱县| 景洪市| 绥滨县| 广水市| 昌平区| 安顺市| 苏尼特右旗| 中方县| 江川县| 涿鹿县| 遵化市| 龙泉市| 洛宁县| 永城市| 自治县| 香河县| 和田市| 武清区| 祁连县| 万源市| 阳新县| 呼玛县| 江源县| 布拖县| 孟州市| 阿巴嘎旗| 澳门| 定结县| 犍为县| 南康市| 叶城县| 南昌县| 巴塘县|