中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

C++ STL中vector用法簡要總結

發布時間:2020-06-26 07:54:06 來源:網絡 閱讀:696 作者:googlingman 欄目:開發技術

1.基本使用舉例


下面的代碼給出了vector的基本使用舉例。

#include <iostream>
#include <vector>
#include <algorithm>
#include <cstdlib>
using namespace std;
typedef vector<int> INTVECTOR;
int main(void)
{
vector<int> num;   // STL中的vector容器
int element;
// 從標準輸入設備讀入整數,
// 直到輸入的是非整型數據為止
while (cin >> element)     //ctrl+Z 結束輸入
   num.push_back(element);
// STL中的排序算法
sort(num.begin(), num.end());
// 將排序結果輸出到標準輸出設備
for (int i = 0; i < num.size(); i ++)
   cout << num[i] << " ";
cout<<endl;
    //vec1對象初始為空
    INTVECTOR vec1;  
    //vec2對象最初有10個值為6的元素
    INTVECTOR vec2(10,6);
    //vec3對象最初有3個值為6的元素
    INTVECTOR vec3(vec2.begin(),vec2.begin()+3);
    //聲明一個名為i的雙向迭代器
    INTVECTOR::iterator i;
    //從前向后顯示vec1中的數據
    cout<<"vec1.begin()--vec1.end():"<<endl;
    for (i =vec1.begin(); i !=vec1.end(); ++i)
        cout << *i << " ";
    cout << endl;
    //從前向后顯示vec2中的數據
    cout<<"vec2.begin()--vec2.end():"<<endl;
    for (i =vec2.begin(); i !=vec2.end(); ++i)
        cout << *i << " ";
    cout << endl;
    //從前向后顯示vec3中的數據
    cout<<"vec3.begin()--vec3.end():"<<endl;
    for (i =vec3.begin(); i !=vec3.end(); ++i)
        cout << *i << " ";
    cout << endl;

    //測試添加和插入成員函數
    vec1.push_back(2);
    vec1.push_back(4);
    vec1.insert(vec1.begin()+1,5); //在第一個位置后插入5
    vec1.insert(vec1.begin()+1,vec3.begin(),vec3.end());//在第一個位置后插入ve3開始到結束的數字
    cout<<"push() and insert():" <<endl;
    for (i =vec1.begin(); i !=vec1.end(); ++i)
        cout << *i << " ";
    cout << endl;
    //測試賦值成員函數
    vec2.assign(8,1);//重新給vec2賦了8個值1
    cout<<"vec2.assign(8,1):" <<endl;
    for (i =vec2.begin(); i !=vec2.end(); ++i)
        cout << *i << " ";
    cout << endl;
    //測試引用類函數
    cout<<"vec1.front()="<<vec1.front()<<endl;
    cout<<"vec1.back()="<<vec1.back()<<endl;
    cout<<"vec1.at(4)="<<vec1.at(4)<<endl;
    cout<<"vec1[4]="<<vec1[4]<<endl;
    //測試移出和刪除
    vec1.pop_back();//最高位前移一位(去掉最高位)
    cout<<"vec1.pop_back():" <<endl;
    for (i =vec1.begin(); i !=vec1.end(); ++i)
        cout << *i << " ";
    cout << endl;
    vec1.erase(vec1.begin()+1,vec1.end()-2);//清除 vec1.begin()+1到vec1.end()-2
    cout<<"vec1.erase():" <<endl;
    for (i =vec1.begin(); i !=vec1.end(); ++i)
        cout << *i << " ";
    cout << endl;
    //顯示序列的狀態信息
    cout<<"vec1.capacity(): "<<vec1.capacity()<<endl; //capacity() 告訴你最多添加多少個元素才會導致容器重分配內存
    cout<<"vec1.max_size(): "<<vec1.max_size()<<endl;
    cout<<"vec1.size(): "<<vec1.size()<<endl;   //size() 是告訴你容器當中目前實際有多少個元素
    cout<<"vec1.empty(): "<<vec1.empty()<<endl;
    //vector序列容器的運算
    cout<<"vec1==vec3: "<<(vec1==vec3)<<endl; //相等返回1,不相等返回0
    cout<<"vec1<=vec3: "<<(vec1<=vec3)<<endl; //小于等于返回1,否則返回0
   system("pause");
   return 0;
}

2.內存分配與釋放

1.vector的內存增長

vector其中一個特點:內存空間只會增長,不會減小。為了支持快速的隨機訪問,vector容器的元素以連續方式存放,每一個元素都緊挨著前一個元素存儲。設想一下,當vector添加一個元 素時,為了滿足連續存放這個特性,都需要重新分配空間、拷貝元素、撤銷舊空間,這樣性能難以接受。因此STL實現者在對vector進行內存分配時,其實際分配的容量要比當前所需的空間多一些。就是說,vector容器預留了一些額外的存儲區,用于存放新添加的元素,這樣就不必為每個新元素重新分配整個容器的內存空間。

在調用push_back時,每次執行push_back操作,相當于底層的數組實現要重新分配大小;這種實現體現到vector實現就是每當 push_back一個元素,都要重新分配一個大一個元素的存儲,然后將原來的元素拷貝到新的存儲,之后在拷貝push_back的元素,最后要析構原有的vector并釋放原有的內存。例如下面程序:

#include <iostream>#include <cstdlib>#include <vector>using namespace std;class Point
{public:
        Point()
        {
            cout << "construction" << endl;
        }
        Point(const Point& p)
        {
            cout << "copy construction" << endl;
        }        ~Point()
        {
            cout << "destruction" << endl;
        }
};int main()
{
    vector<Point> pointVec;
    Point a;
    Point b;
    pointVec.push_back(a);
    pointVec.push_back(b);

    cout<<pointVec.size()<<std::endl;    return 0;
}

輸出結果:
 C++ STL中vector用法簡要總結

其中執行

pointVec.push_back(a);

此時vector會申請一個內存空間,并調用拷貝構造函數將a放到vector中

再調用

pointVec.push_back(b);

此時內存不夠 需要擴大內存,重新分配內存 這時再調用拷貝構造函數將a拷貝到新的內存,再將b拷入新的內存,同時有人調用Point拷貝構造函數,最后釋放原來的內存 此時調用Point的析構函數。

 

2.vector的內存釋放

由于vector的內存占用空間只增不減,比如你首先分配了10,000個字節, 然后erase掉后面9,999個,留下一個有效元素,但是內存占用仍為10,000個。所有內存空間是在vector析構時候才能被系統回收。 empty()用來檢測容器是否為空的,clear()可以清空所有元素。但是即使clear(),vector所占用的內存空間依然如故,無法保證內存 的回收。

如果需要空間動態縮小,可以考慮使用deque。如果vector,可以用swap()來幫助你釋放內存。具體方法如下:

vector<Point>().swap(pointVec); //或者pointVec.swap(vector<Point> ())

標準模板:

template < class T >void ClearVector( vector< T >& vt ) 
{
    vector< T > vtTemp; 
    veTemp.swap( vt );
}

swap()是交換函數,使vector離開其自身的作用域,從而強制釋放vector所占的內存空間,總而言之,釋放vector內存最簡單的方 法是vector<Point>().swap(pointVec)。當時如果pointVec是一個類的成員,不能把 vector<Point>().swap(pointVec)寫進類的析構函數中,否則會導致double free or corruption (fasttop)的錯誤,原因可能是重復釋放內存。(前面的pointVec.swap(vector<Point> ())用G++編譯沒有通過)

 

3.其他情況釋放內存

如果vector中存放的是指針,那么當vector銷毀時,這些指針指向的對象不會被銷毀,那么內存就不會被釋放。如下面這種情況,vector中的元素時由new操作動態申請出來的對象指針:

#include <vector> 
using namespace std; 

vector<void *> v;

每次new之后調用v.push_back()該指針,在程序退出或者根據需要,用以下代碼進行內存的釋放:

for (vector<void *>::iterator it = v.begin(); it != v.end(); it ++) 
    if (NULL != *it) 
    {
        delete *it; 
        *it = NULL;
    }
v.clear();


向AI問一下細節

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

AI

偏关县| 顺昌县| 苏州市| 湾仔区| 洪江市| 军事| 长治县| 顺昌县| 铅山县| 浠水县| 广德县| 孝义市| 措美县| 长沙市| 江西省| 涟源市| 固原市| 清河县| 巴林左旗| 南木林县| 林西县| 化德县| 星子县| 兴国县| 灌云县| 铁岭市| 正镶白旗| 武强县| 富蕴县| 乐至县| 黄龙县| 梅州市| 来宾市| 泌阳县| 辽中县| 望谟县| 勐海县| 连城县| 工布江达县| 垦利县| 凯里市|