亚洲精品中文免费|亚洲日韩中文字幕制服|久久精品亚洲免费|一本之道久久免费

      
      

            <dl id="hur0q"><div id="hur0q"></div></dl>

                C++看圖學(xué)碼:std::vector

                C++看圖學(xué)碼:std::vector

                簡(jiǎn)介

              1. 向量是代表數(shù)組的序列容器,可以改變大小。就像數(shù)組一樣,向量對(duì)其元素使用連續(xù)的存儲(chǔ)位置,這意味著它們的元素也可以使用常規(guī)指針上的偏移量來(lái)訪問(wèn)其元素,而且和數(shù)組一樣有效。但與數(shù)組不同的是,它們的大小可以動(dòng)態(tài)變化,其存儲(chǔ)由容器自動(dòng)處理。
              2. 在內(nèi)部,向量使用一個(gè)動(dòng)態(tài)分配的數(shù)組來(lái)存儲(chǔ)其元素。這個(gè)數(shù)組可能需要重新分配,以便在插入新元素時(shí)增加其大小,這意味著要分配一個(gè)新的數(shù)組并將所有元素移到其中。就處理時(shí)間而言,這是一個(gè)相對(duì)昂貴的任務(wù),因此,向量不會(huì)在每次向容器添加元素時(shí)重新分配。
              3. 相反,向量容器可能會(huì)分配一些額外的存儲(chǔ),以適應(yīng)可能的增長(zhǎng),因此容器的實(shí)際容量可能大于嚴(yán)格意義上的包含其元素所需的存儲(chǔ)(即其大小)。庫(kù)可以實(shí)現(xiàn)不同的增長(zhǎng)策略,以平衡內(nèi)存的使用和重新分配,但在任何情況下,重新分配應(yīng)該只發(fā)生在對(duì)數(shù)增長(zhǎng)的大小間隔,以便在向量的末端插入單個(gè)元素可以提供攤銷的恒定時(shí)間復(fù)雜性(見(jiàn)push_back)。
              4. 因此,與數(shù)組相比,向量消耗更多的內(nèi)存來(lái)?yè)Q取管理存儲(chǔ)的能力,并以有效的方式動(dòng)態(tài)增長(zhǎng)。
              5. 與其他動(dòng)態(tài)序列容器(deques、lists和forward_lists)相比,向量在訪問(wèn)其元素時(shí)非常高效(就像數(shù)組一樣),并且相對(duì)高效地從其末端添加或刪除元素。對(duì)于涉及在末端以外的位置插入或刪除元素的操作,它們的表現(xiàn)比其他的差,而且與list和forward_lists相比,它們的迭代器和引用也不太一致。
              6. 要點(diǎn)

                • 無(wú)開(kāi)銷的隨機(jī)訪問(wèn)
                • 快速遍歷;適合于線性搜索
                • 以攤銷后的恒定時(shí)間在末端插入
                • 如果在頭部或者隨機(jī)位置的進(jìn)行插入或刪除操作占主導(dǎo)地位,可能會(huì)很慢
                • 如果元素類型有很高的復(fù)制/分配成本,可能會(huì)很慢(重新排序的元素需要復(fù)制/移動(dòng)它們)。
                • 對(duì)于大量的值來(lái)說(shuō),可能會(huì)有很長(zhǎng)的分配時(shí)間
                • std::vector 是封裝動(dòng)態(tài)數(shù)組的順序容器。
                • std::pmr::vector 是使用多態(tài)分配器的模板別名。

                例子1

                vector內(nèi)存布局

                #include #include int main(){ std::vector v {2,4,5}; v.push_back(6); v.pop_back(); v[1] = 3; std::cout << v[2] << std::endl; for (int x : v) std::cout << x << ' '; std::cout << std::endl; v.reserve(8); v.resize(5, 0); for (int x : v) std::cout << x << ' '; std::cout << std::endl; std::cout << v.capacity() << std::endl; std::cout << v.size() << std::endl;}https://wandbox.org/nojs/gcc-headhttps://wandbox.org/nojs/clang-head

                例子2

                #include #include using namespace std;struct p2d { p2d(int x_, int y_): x{x_}, y{y_} {} int x, y;}; int main(){ vector v { p2d{2,3} }; // insert copy v.push_back( p2d{6,4} ); // construct in place with // constructor arguments v.emplace_back(9,7); // iterator to first pos v.emplace(begin(v), 5,8); for (p2d x : v) std::cout << x.x << ' ' << x.y << std::endl;}

                例子3

                #include #include int main(){ std::vector v {0,1,2,3,5,6}; auto i = std::begin(v) + 3; //v.insert(i,8); //std::cout << *i; // ERROR //v.erase(i); //std::cout << *i; // ERROR std::cout << *i << std::endl; i = v.insert(i,8); std::cout << *i << std::endl; i = v.erase(i); std::cout << *i << std::endl; for (int x : v) std::cout << x << ' '; std::cout << std::endl;}

                鄭重聲明:本文內(nèi)容及圖片均整理自互聯(lián)網(wǎng),不代表本站立場(chǎng),版權(quán)歸原作者所有,如有侵權(quán)請(qǐng)聯(lián)系管理員(admin#wlmqw.com)刪除。
                用戶投稿
                上一篇 2022年6月23日 12:11
                下一篇 2022年6月23日 12:11

                相關(guān)推薦

                聯(lián)系我們

                聯(lián)系郵箱:admin#wlmqw.com
                工作時(shí)間:周一至周五,10:30-18:30,節(jié)假日休息