日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

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

發(fā)布時(shí)間:2023/12/2 c/c++ 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++ vector使用的一些注意事项 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
更多精彩,請點(diǎn)擊上方藍(lán)字關(guān)注我們!

1. 初始化

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

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

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

2. ?添加元素:push_back

?????? 通過push_back添加新的元素進(jìn)入vector后,vector的內(nèi)存有時(shí)候會發(fā)生變化,這取決于size和capacity大小,當(dāng)然這些都是系統(tǒng)來處理的,詳細(xì)可以參考stl源碼

??????? 當(dāng)size<capacity的時(shí)候,直接加到末尾,不會變化

??????? 當(dāng)size==capacity的時(shí)候,會重新申請另外一塊內(nèi)存,然后copy過去加到尾部,這個時(shí)候就會有變化了。

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

???????????????? begin()? //起始位置

???????????????? end() //結(jié)束位置

???????????????? size() //當(dāng)前大小

???????? capacity() //當(dāng)前容量,即已申請的內(nèi)存大小

???? vector是一段連續(xù)的內(nèi)存空間,有三個標(biāo)識內(nèi)存的位置,start,end,finish, size=end-start, capacity=finish-start

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

???? 有時(shí)候也有size<capacity, 這個時(shí)候就直接加在尾部了。

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. 關(guān)于earse和remove

???? erase返回的是當(dāng)前刪除的元素的一下個位置的迭代器,所以需要注意的是遍歷時(shí)候的++運(yùn)算,這個與其它list,map差不多,

??? 需要注意的earse后內(nèi)存并未真正的清空,僅僅是刪除內(nèi)容,真正的容量大小capacity并沒有改變,需要通過swap來實(shí)現(xiàn)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的內(nèi)存空洞清除 printVector(vecNum);

?//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. 關(guān)于vector< bool>? -- 慎用

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

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

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

早在C++98的時(shí)候,就有vector< bool>這個類型了,但是因?yàn)楫?dāng)時(shí)為了考慮到節(jié)省空間的想法,所以vector< bool>里面不是一個Byte一個Byte儲存的,它是一個bit一個bit儲存的!

因?yàn)镃++沒有直接去給一個bit來操作,

??? 所以用operator[]的時(shí)候, 正常容器返回的應(yīng)該是一個對應(yīng)元素的引用,

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

?? 因此,使用auto自動類型推導(dǎo)時(shí)會出現(xiàn)問題

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


它,

不僅僅是一個碼

掃碼關(guān)注

C++資源免費(fèi)送

總結(jié)

以上是生活随笔為你收集整理的C++ vector使用的一些注意事项的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。