• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            面對(duì)現(xiàn)實(shí),超越自己
            逆水行舟,不進(jìn)則退
            posts - 269,comments - 32,trackbacks - 0

            C++ Vector(向量容器)

            是一個(gè)線(xiàn)性順序結(jié)構(gòu)。相當(dāng)于數(shù)組,但其大小可以不預(yù)先指定,并且自動(dòng)擴(kuò)展。它可以像數(shù)組一樣被操作,由于它的特性我們完全可以將vector 看作動(dòng)態(tài)數(shù)組。

            在創(chuàng)建一個(gè)vector 后,它會(huì)自動(dòng)在內(nèi)存中分配一塊連續(xù)的內(nèi)存空間進(jìn)行數(shù)據(jù)存儲(chǔ),初始的空間大小可以預(yù)先指定也可以由vector 默認(rèn)指定,這個(gè)大小即capacity ()函數(shù)的返回值。當(dāng)存儲(chǔ)的數(shù)據(jù)超過(guò)分配的空間時(shí)vector 會(huì)重新分配一塊內(nèi)存塊,但這樣的分配是很耗時(shí)的,在重新分配空間時(shí)它會(huì)做這樣的動(dòng)作:

            首先,vector 會(huì)申請(qǐng)一塊更大的內(nèi)存塊;

            然后,將原來(lái)的數(shù)據(jù)拷貝到新的內(nèi)存塊中;

            其次,銷(xiāo)毀掉原內(nèi)存塊中的對(duì)象(調(diào)用對(duì)象的析構(gòu)函數(shù));

            最后,將原來(lái)的內(nèi)存空間釋放掉。

            如果vector 保存的數(shù)據(jù)量很大時(shí),這樣的操作一定會(huì)導(dǎo)致糟糕的性能(這也是vector 被設(shè)計(jì)成比較容易拷貝的值類(lèi)型的原因)。所以說(shuō)vector 不是在什么情況下性能都好,只有在預(yù)先知道它大小的情況下vector 的性能才是最優(yōu)的。

             

            vector 的特點(diǎn):

            (1) 指定一塊如同數(shù)組一樣的連續(xù)存儲(chǔ),但空間可以動(dòng)態(tài)擴(kuò)展。即它可以像數(shù)組一樣操作,并且可以進(jìn)行動(dòng)態(tài)操作。通常體現(xiàn)在push_back() pop_back()

            (2) 隨機(jī)訪(fǎng)問(wèn)方便,它像數(shù)組一樣被訪(fǎng)問(wèn),即支持[ ] 操作符和vector.at()

            (3) 節(jié)省空間,因?yàn)樗沁B續(xù)存儲(chǔ),在存儲(chǔ)數(shù)據(jù)的區(qū)域都是沒(méi)有被浪費(fèi)的,但是要明確一點(diǎn)vector 大多情況下并不是滿(mǎn)存的,在未存儲(chǔ)的區(qū)域?qū)嶋H是浪費(fèi)的。

            (4) 在內(nèi)部進(jìn)行插入、刪除操作效率非常低,這樣的操作基本上是被禁止的。Vector 被設(shè)計(jì)成只能在后端進(jìn)行追加和刪除操作,其原因是vector 內(nèi)部的實(shí)現(xiàn)是按照順序表的原理。

            (5) 只能在vector 的最后進(jìn)行push pop ,不能在vector 的頭進(jìn)行push pop

            (6) 當(dāng)動(dòng)態(tài)添加的數(shù)據(jù)超過(guò)vector 默認(rèn)分配的大小時(shí)要進(jìn)行內(nèi)存的重新分配、拷貝與釋放,這個(gè)操作非常消耗性能。 所以要vector 達(dá)到最優(yōu)的性能,最好在創(chuàng)建vector 時(shí)就指定其空間大小。

            Vectors 包含著一系列連續(xù)存儲(chǔ)的元素,其行為和數(shù)組類(lèi)似。訪(fǎng)問(wèn)Vector中的任意元素或從末尾添加元素都可以在常量級(jí)時(shí)間復(fù)雜度內(nèi)完成,而查找特定值的元素所處的位置或是在Vector中插入元素則是線(xiàn)性時(shí)間復(fù)雜度。

             

            1.Constructors 構(gòu)造函數(shù)

            vector<int> v1; //構(gòu)造一個(gè)空的vector

            vector<int> v1( 5, 42 ); //構(gòu)造了一個(gè)包含5個(gè)值為42的元素的Vector

            2.Operators 對(duì)vector進(jìn)行賦值或比較

            C++ Vectors能夠使用標(biāo)準(zhǔn)運(yùn)算符: ==, !=, <=, >=, <, 和 >.

            要訪(fǎng)問(wèn)vector中的某特定位置的元素可以使用 [] 操作符.

            兩個(gè)vectors被認(rèn)為是相等的,如果:

            1.它們具有相同的容量

            2.所有相同位置的元素相等.

            vectors之間大小的比較是按照詞典規(guī)則.

            3.assign() 對(duì)Vector中的元素賦值

            語(yǔ)法:

            void assign( input_iterator start, input_iterator end );

            // 將區(qū)間[start, end)的元素賦到當(dāng)前vector

            void assign( size_type num, const TYPE &val );

            // 賦num個(gè)值為val的元素到vector中,這個(gè)函數(shù)將會(huì)清除掉為vector賦值以前的內(nèi)容。

            4.at() 返回指定位置的元素

            語(yǔ)法:

            TYPE at( size_type loc );//差不多等同v[i];但比v[i]安全;

            5.back() 返回最末一個(gè)元素

            6.begin() 返回第一個(gè)元素的迭代器

            7.capacity() 返回vector所能容納的元素?cái)?shù)量(在不重新分配內(nèi)存的情況下)

            8.clear() 清空所有元素

            9.empty() 判斷Vector是否為空(返回true時(shí)為空)

            10.end() 返回最末元素的迭代器(譯注:實(shí)指向最末元素的下一個(gè)位置)

            11.erase() 刪除指定元素

            語(yǔ)法:

            iterator erase( iterator loc );//刪除loc處的元素

            iterator erase( iterator start, iterator end );//刪除start和end之間的元素

            12.front() 返回第一個(gè)元素的引用

            13.get_allocator() 返回vector的內(nèi)存分配器

            14.insert() 插入元素到Vector中

            語(yǔ)法:

            iterator insert( iterator loc, const TYPE &val );

            //在指定位置loc前插入值為val的元素,返回指向這個(gè)元素的迭代器,

            void insert( iterator loc, size_type num, const TYPE &val );

            //在指定位置loc前插入num個(gè)值為val的元素

            void insert( iterator loc, input_iterator start, input_iterator end );

            //在指定位置loc前插入?yún)^(qū)間[start, end)的所有元素

            15.max_size() 返回Vector所能容納元素的最大數(shù)量(上限)

            16.pop_back() 移除最后一個(gè)元素

            17.push_back() 在Vector最后添加一個(gè)元素

            18.rbegin() 返回Vector尾部的逆迭代器

            19.rend() 返回Vector起始的逆迭代器

            20.reserve() 設(shè)置Vector最小的元素容納數(shù)量

            //為當(dāng)前vector預(yù)留至少共容納size個(gè)元素的空間

            21.resize() 改變Vector元素?cái)?shù)量的大小

            語(yǔ)法:

            void resize( size_type size, TYPE val );

            //改變當(dāng)前vector的大小為size,且對(duì)新創(chuàng)建的元素賦值val

            22.size() 返回Vector元素?cái)?shù)量的大小

            23.swap() 交換兩個(gè)Vector

            語(yǔ)法:

            void swap( vector &from );

             

             Vector用法 :

            1.聲明:

            一個(gè)vector類(lèi)似于一個(gè)動(dòng)態(tài)的一維數(shù)組。

            vector<int> a; //聲明一個(gè)元素為int類(lèi)型的vector a

            vectot<MyType> a; //聲明一個(gè)元素為MyType類(lèi)型的vector a

            這里的聲明的a包含0個(gè)元素,既a.size()的值為0,但它是動(dòng)態(tài)的,其大小會(huì)隨著數(shù)據(jù)的插入和刪除改變而改變。

            vector<int> a(100, 0); //這里聲明的是一個(gè)已經(jīng)存放了100個(gè)0的整數(shù)vector

            你可以用以下的幾種方法聲明一個(gè) vector 對(duì)象:

            vector<float> v(5, 3.25); //初始化有5 個(gè)元素,其值都是3.25

            vector<float> v_new1(v);

            vector<float> v_new2 = v;

            vector<float> v_new3(v.begin(), v.end());

            這四個(gè)vector 對(duì)象是相等的,可以用operator==來(lái)判斷。

            2.向量操作

            常用函數(shù):

            size_t size(); // 返回vector的大小,即包含的元素個(gè)數(shù)

            void pop_back(); // 刪除vector末尾的元素,vector大小相應(yīng)減一

            void push_back(); //用于在vector的末尾添加元素

            T back(); // 返回vector末尾的元素

            void clear(); // 將vector清空,vector大小變?yōu)?

            其他訪(fǎng)問(wèn)方式:

            cout<<a[5]<<endl;

            cout<<a.at(5)<<endl;

            以上區(qū)別在于后者在訪(fǎng)問(wèn)越界時(shí)會(huì)拋出異常,而前者不會(huì)。

            3.遍歷

            (1). for(vector<datatype>::iterator it=a.begin(); it!=a.end();it++)

            cout<<*it<<endl;

            (2). for(int i=0;i<a.size;i++)

            cout<<a[i]<<endl;

             

            現(xiàn)在想得到容器中能保存的最大元素?cái)?shù)量就可以用 vector 類(lèi)的成員函數(shù)max_size():

            vector<shape>::size_type max_size = my_shapes.max_size();

            當(dāng)前容器的實(shí)際尺寸 --- 已有的元素個(gè)數(shù)用size():

            vector<shape>::size_type size = my_shapes.size();

            就像size_type 描述了vector 尺寸的類(lèi)型,value_type 說(shuō)明了其中保存的對(duì)象的類(lèi)型:

            cout << “value type: “ << typeid(vector<float>::value_type).name();

            輸出:

            value type: float

            可以用capacity()來(lái)取得vector 中已分配內(nèi)存的元素個(gè)數(shù):

            vector<int> v;

            vector<int>::size_type capacity = v.capacity();

            vector 類(lèi)似于數(shù)組,可以使用下標(biāo)[]訪(fǎng)問(wèn):

            vector<int> v(10);

            v[0] = 101;

            注意到這里預(yù)先給10 個(gè)元素分配了空間。你也可以使用vector 提供的插入函數(shù)來(lái)動(dòng)態(tài)的擴(kuò)

            展容器。成員函數(shù)push_back()就在vector 的尾部添加了一個(gè)元素:

            v.push_back(3);

            也可以用insert()函數(shù)完成同樣的工作:

            v.insert(v.end(), 3);

            這里insert()成員函數(shù)需要兩個(gè)參數(shù):一個(gè)指向容器中指定位置的迭代器(iterator),一個(gè)待插

            入的元素。insert()將元素插入到迭代器指定元素之前。

            現(xiàn)在對(duì)迭代器(Iterator)做點(diǎn)解釋。Iterator 是指針(pointer)的泛化,iterator 要求定義

            operator*,它返回指定類(lèi)型的值。Iterator 常常和容器聯(lián)系在一起。例子:

            vector<int> v(3);

            v[0] = 5;

            v[1] = 2;

            v[2] = 7;

             

            vector<int>::iterator first = v.begin();

            vector<int>::iterator last = v.end();

            while (first != last)

            cout << *first++ << “ “;

            上面代碼的輸出是:

            5 2 7

            begin()返回的是vector 中第一個(gè)元素的iterator,而end()返回的并不是最后一個(gè)元素的

            iterator,而是past the last element。在STL 中叫past-the-end iterator

            組合查找
            vector<int>::iterator result = find( v.begin( ), v.end( ), 2 ); //查找2
            if ( result == v.end( ) ) //沒(méi)找到
                    cout << "No" << endl;
             else //找到
                    cout << "Yes" << endl;


             

            posted on 2012-06-04 09:18 王海光 閱讀(11060) 評(píng)論(0)  編輯 收藏 引用 所屬分類(lèi): STL
            亚洲中文字幕无码久久精品1| 无遮挡粉嫩小泬久久久久久久| 亚洲国产二区三区久久| 国内精品久久久久久久久电影网| 久久国产精品偷99| 伊人久久无码中文字幕| 伊人色综合久久天天| 亚洲午夜福利精品久久| 国产精品久久久久国产A级| 久久久久国产成人精品亚洲午夜| 99久久精品国产一区二区| 999久久久国产精品| 久久久免费精品re6| 武侠古典久久婷婷狼人伊人| 日本免费一区二区久久人人澡 | 久久久久久久精品妇女99| 国产精品无码久久综合网| 久久人爽人人爽人人片AV | 国产成人精品久久综合| 久久综合久久自在自线精品自| 欧美久久久久久午夜精品| 狠狠色丁香久久综合五月| 久久久久久精品久久久久| 久久综合九色综合久99| 一本久久久久久久| 国产精品国色综合久久| 色婷婷综合久久久中文字幕| 国内精品久久久久影院薰衣草| 四虎国产精品成人免费久久| 久久精品国产第一区二区| 国产福利电影一区二区三区久久久久成人精品综合| 一日本道伊人久久综合影| 日产久久强奸免费的看| 久久97久久97精品免视看| 精品久久人人做人人爽综合| 色综合久久精品中文字幕首页| 国产精品一区二区久久国产| 久久99国产综合精品女同| 久久99精品久久只有精品| 久久久久亚洲精品天堂| 久久精品国产91久久综合麻豆自制|