青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

C++研究

C++細節深度探索及軟件工程

  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
  37 隨筆 :: 0 文章 :: 74 評論 :: 0 Trackbacks

下載PDF:STL容器的基本使用[資料]

幾種STL容器的基本用法[資料]

常興龍

天津大學計算機學院

QQ:286259397 MSN:cxl82116@msn.com

一、原型與構造函數

Vector的原型可定義為

vector<T, allocator <T> >

其構造函數為

vector()             //空的

vector(al)          //指定一種allocator

vector(n)           //用默認T()初始化n個元素

vector(n, val)   //Val初始化n個元素

vector(n,val,al)         //val初始化n個元素,用al做分配器

vector(first,last)       //從己有的firstlast復制生成

vector(first,last,al)  //從己有的firstlast復制生成,用al做分配器

 

二、操作

1.開辟N個空間

vecobj.reserve(N);

2.當前(重新分配內存前)得到最大容量

capacity();

3.重新分配內存為N

resize(N)

如果變小,則刪除多余。如果變大,則用T()添充

4.清空

clear();

注意,clear()resize()都不一定使得vector變小,若欲釋放內存,請使用vecobj.swap(vector<T, A>())

5.存取首尾元素

front()back()操作,取后一個和最前一個元素,注意其返回是引用,其而是左值(l_value),因此可以賦值. 做類似于vecobj.front() = 3;的操作,但要保證front空間有效,否則形為無法預測。

6.取值

[]at可以做此操作,at會檢查,如果越界有會out_of_range的異常被throw

7.push_back, pop_back

要保證不為空

8.使用assign

assign可以改變大小和初值,大小是隨意的,不受開始時大小的限制,如果設置為0,則清空。

assign(5,0)vector改為5個大小,并用0添充

assign(iax+3,iax+5); 從數組第45個填充,注意左閉右開,即可取到iax[3]iax[4]

9.使用insert

insert(it, x),it前插入一個元素x

insert(it,first,last),it前插入一個序列[first,last)左閉右開

10.使用erase

erase(it)刪除在it處的元素,返回值為下一元素。如果intVec.erase(intVec.end());并不會報錯,如果刪除一個序列[first,last),使用erase(first,last)

11.BVectorvector<bool>的特化版,具體的用途有待查證

12.flip()把某一元素,求反。如vecObj[i].flip();

13.swap. vecObj.swap(vecObj[i],vecObj[j]);

若要在容器中裝一個對象并且能并檢索,需要重載operator == ,如下:

#include <vector>

#include <iostream>

#include <stdlib.h>

#include <time.h>

//#include <getopt.h>

using namespace std;

 

class Obj

{

public:

         Obj(int x, int y, int z)

         {

                   this->x = x;

                   this->y = y;

                   this->z = z;

         }

         bool operator == (const Obj & obj)

         {

                   if(obj.x == x && obj.y == y && obj.z == z)

                            return true;

                   return false;

         }

         int getX()

         {

                   return this -> x;

         }

private:

         int x;

         int y;

         int z;

};

 

int main(int argc, char * argv[])

{

         vector<Obj> vecObj;

         Obj obj1(2,3,4);

         Obj obj2(4,5,6);

         vecObj.push_back(obj1);

         vecObj.push_back(obj2);

        

         vector<Obj>::iterator it =find(vecObj.begin(),vecObj.end(),Obj(2,3,4));

         if(it != vecObj.end())

                   cout << (*it).getX() << endl;

         return 0;

}

list的基本用法

vector的用法基本相同,其中需要強調一點的是splice()函數,是指把指定段的另一個List插入到指定位置的前面。

splice(iterator it , list &x)

splice(iterator it, list &x, iterator first)

splice(iterator it,list &x, iterator first, iterator last)

 

一、原型與構造函數

typdef list<T, allocator<T> >  listObj;

構造函數

list() //

list(al) //指定allocator的空表

list(n)//n個元素,所有元素都是T()出來的

list(n,val)//n個元素,所有元素都是T(val)出來的

list(n,val,al)//同上,并指定allocatoral

list(first, last) //復制構造

list(first,last,al) //指定allocator構造

二、操作

1.resize & clear

使用resize(n)改變大小,使用resize(n, val)如果需要用T(val) 來填滿空閑值。

2.front ()& back()

如果listObj非常量對象,返回是一個左值函數

3.插入操作

insert(iterator it , val)

insert(iterator it, first, last)

insert(iteratot it, n, x)//插入nx

4.移除

remove(x); //vector.erase(integrator it)

按值刪

int iax[] ={3,4,5,6,6,7,8};

         list<int> lObj;

         lObj.insert(lObj.begin(),iax, iax + 7);

         lObj.remove(6); //

按函數條件刪

 

#include <iostream>

#include <list>

using namespace std;

// a predicate implemented as a function:

bool single_digit (const int& value) { return (value<10); }

// a predicate implemented as a class:

class is_odd

{

public:

  bool operator() (const int& value) {return (value%2)==1; }

};

int main ()

{

  int myints[]= {15,36,7,17,20,39,4,1};

  list<int> mylist (myints,myints+8);   // 15 36 7 17 20 39 4 1

  mylist.remove_if (single_digit);      // 15 36 17 20 39

  mylist.remove_if (is_odd());          // 36 20

  cout << "mylist contains:";

  for (list<int>::iterator it=mylist.begin(); it!=mylist.end(); ++it)

    cout << " " << *it;

  cout << endl;

  return 0;

}

當然,對于class is_odd,也可以寫成

template <class T>

class is_odd

{

};

調用時,則要改成

mylist.remove_if(is_odd<int>());

5.unique操作

// list::unique

#include <iostream>
#include <cmath>
#include <list>
using namespace std;
 
// a binary predicate implemented as a function:
bool same_integral_part (double first, double second)
{ return ( int(first)==int(second) ); }
 
// a binary predicate implemented as a class:
class is_near
{
public:
  bool operator() (double first, double second)
  { return (fabs(first-second)<5.0); }
};
 
int main ()
{
  double mydoubles[]={ 12.15,  2.72, 73.0,  12.77,  3.14,
                       12.77, 73.35, 72.25, 15.3,  72.25 };
  list<double> mylist (mydoubles,mydoubles+10);
  //UNIQUE以前必須要Sort,切記,它的內部實現是I,i+1的方式
  mylist.sort();             //  2.72,  3.14, 12.15, 12.77, 12.77,            
                             // 15.3,  72.25, 72.25, 73.0,  73.35
 
  mylist.unique();           //  2.72,  3.14, 12.15, 12.77
                             // 15.3,  72.25, 73.0,  73.35
 
  mylist.unique (same_integral_part);  //  2.72,  3.14, 12.15
                                       // 15.3,  72.25, 73.0
 
  mylist.unique (is_near());           //  2.72, 12.15, 72.25
 
  cout << "mylist contains:";
  for (list<double>::iterator it=mylist.begin(); it!=mylist.end(); ++it)
    cout << " " << *it;
  cout << endl;
 
  return 0;
}

6.排序操作

sort(); //默認按operator <排序,從小到大

sort(pr); //prFunctional函數

7.Merge操作

merge操作前,需要對兩個序列都用operator <排序,當然,也可以指定pr排序函數

merge(s2)

merge(s2,pr);

8.reverse()

翻轉操作,把整個list翻轉

deque的基本操作

一、原型與構造函數

typedef deque<T, allocator<T> > deqObj;

構造函數

deque();

deque(al);

deque(n);

deque(n,x);

deque(n,x,al);

deque(first,last);

deque(first,last,al);

二、操作

1.resize & clear

使用resize(n)改變大小,使用resize(n, val)如果需要用T(val) 來填滿空閑值。

2.clear操作

clear后調用deqObj.swap(deque<T,A>())是好習慣,而且也一定要這么做。

3.font(),back(),operator [],(如出邊界,形為未定)at()(如出邊界,拋異常),push_back(),push_front(),pop_back(),pop_front(),insert(iterator it,x),insert(iterator it,n,x),insert(iterator first,iterator last),(插入后指向剛插入的值)erase(it),刪除在it指定位置的值,erase(iterator first,iterator last)刪除指定區間的值(左閉右開)。這些操作與上面的操作雷同。

 

Setmultiset的基本操作

一、原型與構造函數

typedef set<Key, less<Key>, allocator<key> > setObj;

構造函數

set(); //set,pred()排序

set(pr); //聲明一個空的按pr排序的set

set(pr,al); //聲明一個按pr排序的集合用al分配

set(first,last)

set(first,last,pr)

set(first,last,pr,al)

操作

1.clear()

2.erase(it); erase(first, last)

3.insert(key),返回值為pair<iterator, bool> 類型,沒有與插入元素相同的元素時,secondtrue,此時first指向新插入的元素。否則為Falsefirst仍指向原來的元素

4.find(key)

5.lower_bound(key)

6.upper_bound(key)

7.equal_range(key),返回一個pair<iterator , iterator >(lower_bound(key), upper_bound(key))

8.count, equal_range的長度

9.key_comp,如果k1排在k2的前面,那么key_comp()(key1,key2)就為true

10.value_comp,對于set<key>對象,它與key_comp一樣。

multiset

1.insert,由于insert總能成功,那么它返回的就是新元素的迭代器,而并非pair<iteraor, bool>對象.

2.find返回第一個與key相等的迭代器。

3.equal_range將返回 [0,setObj.size())的任意長度.

4.count()將返回[0,setObj.size())的任意值。

 



 

posted on 2007-09-19 03:51 常興龍 閱讀(2736) 評論(0)  編輯 收藏 引用 所屬分類: STL
> hi的博客
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲欧美在线免费观看| 亚洲男人的天堂在线| 999在线观看精品免费不卡网站| 国产精品va在线播放| 欧美噜噜久久久xxx| 欧美三级视频在线播放| 欧美日韩精品免费在线观看视频| 欧美aaa级| 欧美日韩99| 国产精品亚洲综合久久| 欧美激情按摩在线| 宅男噜噜噜66一区二区| 亚洲无线一线二线三线区别av| 夜夜嗨av色综合久久久综合网 | 久久久久中文| 久久免费视频这里只有精品| 欧美电影免费网站| 亚洲欧美日韩一区二区三区在线观看 | 亚洲精品资源| 亚洲精品免费看| 香蕉av777xxx色综合一区| 美女网站久久| 精品999在线播放| 性色一区二区三区| 中文亚洲字幕| 亚洲欧美经典视频| 亚洲欧美日韩国产成人| 久久精品噜噜噜成人av农村| 亚洲国产日韩欧美在线99| 午夜精品久久久久久久久久久久| 男女av一区三区二区色多| 国产精品嫩草99av在线| 亚洲电影在线观看| 欧美在线一二三区| 亚洲六月丁香色婷婷综合久久| 欧美综合国产| 国产欧美日韩视频在线观看| 性做久久久久久| 亚洲欧美在线x视频| 国产精品久久久久国产a级| 亚洲国产精品v| 嫩模写真一区二区三区三州| 久久精品国产亚洲一区二区| 激情久久五月天| 欧美成人免费全部观看天天性色| 国产亚洲精品久| 久久久av毛片精品| 看片网站欧美日韩| 亚洲精品一品区二品区三品区| 亚洲理伦在线| 国产亚洲精品久久久久婷婷瑜伽| 久久亚洲欧洲| 欧美日韩一区二区在线观看视频| 午夜在线视频观看日韩17c| 久久在线免费视频| 亚洲精品综合精品自拍| 国产精品女人久久久久久| 久热成人在线视频| 国产精品国产三级国产专区53| 久久久噜噜噜久久中文字免| 欧美精品日韩www.p站| 美女露胸一区二区三区| 国产精品豆花视频| 亚洲国产mv| 欧美成人一区二免费视频软件| 一区二区三区四区五区精品| 亚洲尤物视频网| 一区二区三区成人精品| 美女主播一区| 亚洲国产小视频| 亚洲人成人一区二区在线观看 | 国产精品豆花视频| 亚洲理论在线| 羞羞漫画18久久大片| 国产女人aaa级久久久级| 国产精品99久久久久久久vr| 亚洲影院色无极综合| 国产婷婷一区二区| 亚洲欧美变态国产另类| 欧美一级大片在线观看| 狠狠色狠狠色综合系列| 久久精品72免费观看| 午夜欧美大片免费观看| 久久久噜噜噜久久久| 欧美好吊妞视频| 日韩一本二本av| 国产精品久久久久毛片软件 | 欧美一区二区在线| 久久久国产一区二区三区| 亚洲国产mv| 国产精品久久久久久久7电影 | 91久久国产自产拍夜夜嗨| 亚洲精品一二三区| 一区二区三区免费观看| 国产精品高清网站| 久久久视频精品| 一区二区三区高清在线| 女女同性精品视频| 久久久久国产精品一区三寸| 国产一区二区三区日韩欧美| 国产精品成人一区二区三区夜夜夜| 亚洲一区二区少妇| 亚洲国产精品福利| 亚洲欧美日韩精品久久奇米色影视| 国产精品永久免费| 欧美亚一区二区| 欧美大学生性色视频| 久久久久91| 久久蜜桃精品| 久久激情综合| 国产精品日韩一区二区| 亚洲在线观看视频网站| 日韩视频一区二区在线观看 | 国产一区二区三区av电影| 欧美日韩国产免费观看| 欧美日韩久久精品| 国产精品99免视看9| 欧美精品高清视频| 欧美午夜女人视频在线| 亚洲国产欧美一区| 日韩一级精品| 99天天综合性| 亚洲自拍偷拍麻豆| 亚洲国产成人精品女人久久久| 久久久国产成人精品| 久久国产精品第一页| 久久精品av麻豆的观看方式| 久久久精品视频成人| 欧美国产一区二区| 在线午夜精品| 亚洲欧美久久久| 媚黑女一区二区| 亚洲国产欧美日韩精品| 一区二区三区四区五区在线| 香蕉亚洲视频| 欧美成人69| 欧美亚洲一区二区三区| 麻豆亚洲精品| 国产精品综合av一区二区国产馆| 亚洲电影av| 午夜电影亚洲| 日韩午夜免费视频| 国产乱码精品一区二区三区av | 91久久国产精品91久久性色| 亚洲精选在线观看| 欧美不卡一卡二卡免费版| 欧美一级大片在线观看| 国产精品高潮呻吟视频| 亚洲私人影院| 91久久精品一区二区别| 久久免费视频在线观看| 亚洲综合色激情五月| 国产在线精品一区二区中文| 一区二区av在线| 欧美岛国在线观看| 久久综合999| 亚洲视频欧美视频| 欧美成人亚洲成人日韩成人| 香蕉成人久久| 国产精品揄拍500视频| 一区二区高清在线| 亚洲午夜精品福利| 黑人巨大精品欧美黑白配亚洲 | 亚洲国产欧美一区二区三区久久| 欧美一区=区| 久久精品道一区二区三区| 一区二区三区在线视频观看| 欧美高清视频| 欧美三区在线视频| 久久久久久尹人网香蕉| 欧美黄色精品| 欧美在线播放一区二区| 99精品视频一区二区三区| 亚洲一级二级| 亚洲国产一区二区精品专区| 欧美日韩在线播| 欧美亚洲自偷自偷| 久久视频免费观看| 一区二区三区高清不卡| 午夜视频久久久久久| 日韩一区二区免费看| 亚洲专区一区| 一卡二卡3卡四卡高清精品视频| 欧美在线日韩精品| 亚洲一区3d动漫同人无遮挡| 久久久久久穴| 另类激情亚洲| 欧美日韩亚洲高清| 欧美成人一区二区三区在线观看| 国产精品乱码一区二三区小蝌蚪| 亚洲最黄网站| 亚洲性线免费观看视频成熟| 欧美久久成人| 日韩一区二区电影网| 午夜精品久久久久久久男人的天堂| 欧美成人激情视频免费观看| 久久国产精品久久国产精品| 亚洲色图自拍| 欧美特黄一区| 午夜精品久久久久久久|