C++ vector使用

vector 是向量類型猜绣,它可以容納許多類型的數(shù)據(jù),如若干個(gè)整數(shù)敬特,所以稱其為容器掰邢。它相當(dāng)于一個(gè)動(dòng)態(tài)的數(shù)組,當(dāng)程序員無法知道自己需要的數(shù)組的規(guī)模多大時(shí),用其來解決問題可以達(dá)到最大節(jié)約空間的目的。

構(gòu)造vector對(duì)象

vector 是C++ STL的一個(gè)重要成員伟阔,使用它時(shí)需要包含頭文件: #include<vector>


vector<int> a;           //無參數(shù) - 構(gòu)造一個(gè)空的vector,
vector<int> a(10);       //定義了10個(gè)整型元素的向量(尖括號(hào)中為元素類型名辣之,它可以是任何合法的數(shù)據(jù)類型),但沒有給出初值皱炉,其值是不確定的怀估。
vector<int> a(10,1);     //定義了10個(gè)整型元素的向量,且給出每個(gè)元素的初值為1
vector<int> a(b);        //用b向量來創(chuàng)建a向量,整體復(fù)制性賦值合搅, 拷貝構(gòu)造
vector<int> v3=a ;       //移動(dòng)構(gòu)造
vector<int> a(b.begin(),b.begin+3);   //定義了a值為b中第0個(gè)到第2個(gè)(共3個(gè))元素
int b[7]={1,2,3,4,5,9,8};
vector<int> a(b,b+6);    //從數(shù)組中獲得初值多搀,b[0]~b[5]

基本操作-屬性獲取/調(diào)整

1 vec.empty-判斷vec是否為空

a.empty()

2 vec.size-元素的個(gè)數(shù)

a.size()

3 vec.capacity-實(shí)際存儲(chǔ)空間

a.capacity()

4 vec.resize-調(diào)整大小

a.resize(10);        //將a的現(xiàn)有元素個(gè)數(shù)調(diào)至10個(gè),多則刪灾部,少則補(bǔ)康铭,其值隨機(jī)
a.resize(10, 2);      //將a的現(xiàn)有元素個(gè)數(shù)調(diào)至10個(gè),多則刪赌髓,少則補(bǔ)从藤,其值為2

5 vec.reserve-重新分配空間

a.reserve(100);      //將a的容量(capacity)擴(kuò)充至100,也就是說現(xiàn)在測(cè)試a.capacity();的時(shí)候返回值是100.這種操作只有在需要給a添加大量數(shù)據(jù)的時(shí)候才顯得有意義锁蠕,因?yàn)檫@將避免內(nèi)存多次容量擴(kuò)充操作(當(dāng)a的容量不足時(shí)電腦會(huì)自動(dòng)擴(kuò)容夷野,當(dāng)然這必然降低性能),但是最大值不可以大于max_size的值匿沛,否則會(huì)拋出異常

6 比較操作符

a==b;     //b為向量扫责,向量的比較操作還有!=,>=,<=,>,<

基本操作-增加元素

1 vec.push_back()-尾部插入元素

在容器的最后一個(gè)位置插入元素x,如果size值大于capacity值榛鼎,則將重新分配空間

函數(shù):

void push_back (const value_type& val);
void push_back (value_type&& val);
// vector::push_back
#include <iostream>
#include <vector>

int main ()
{
  std::vector<int> myvector;
  int myint;

  std::cout << "Please enter some integers (enter 0 to end):\n";

  do {
    std::cin >> myint;
    myvector.push_back (myint);
  } while (myint);

  std::cout << "myvector stores " << int(myvector.size()) << " numbers.\n";

  return 0;
}

2 vec.insert()-插入元素

第一個(gè)函數(shù)逃呼,在迭代器指定的位置前插入值為x的元素

第二個(gè)函數(shù),在迭代器指定的位置前插入n個(gè)值為x的元素

第三個(gè)函數(shù)者娱,在迭代器指定的位置前插入另外一個(gè)容器的一段序列迭代器first到last

若插入新的元素后總得元素個(gè)數(shù)大于capacity抡笼,則重新分配空間

a.insert(a.begin()+1, 5);         //在a的第1個(gè)元素(從第0個(gè)算起)的位置插入數(shù)值5,如a為1,2,3,4黄鳍,插入元素后為1,5,2,3,4
a.insert(a.begin()+1, 3,5);       //在a的第1個(gè)元素(從第0個(gè)算起)的位置插入3個(gè)數(shù)推姻,其值都為5
a.insert(a.begin()+1,b+3, b+6);   //b為數(shù)組,在a的第1個(gè)元素(從第0個(gè)算起)的位置插入b的第3個(gè)元素到第5個(gè)元素(不包括b+6)框沟,如b為1,2,3,4,5,9,8藏古,插入元素后為1,4,5,9,2,3,4,5,9,8
// inserting into a vector
#include <iostream>
#include <vector>

int main()
{
    std::vector<int> myvector(3, 100);
    std::vector<int>::iterator it;

    it = myvector.begin();
    it = myvector.insert(it, 200);

    myvector.insert(it, 2, 300);

    // "it" no longer valid, get a new one:
    it = myvector.begin();

    std::vector<int> anothervector(2, 400);
    myvector.insert(it + 2, anothervector.begin(), anothervector.end());

    int myarray[] = { 501,502,503 };
    myvector.insert(myvector.begin(), myarray, myarray + 3);

    std::cout << "myvector contains:";
    for (it = myvector.begin(); it < myvector.end(); it++)
        std::cout << ' ' << *it;
    std::cout << '\n';

    system("PAUSE");
    return 0;
}

基本操作-刪除元素

1 vec.erase-刪除

iterator erase (const_iterator position);//刪除指定位置元素增炭,返回迭代器
//例如:a.erase(a.begin()+1)

iterator erase (const_iterator first, const_iterator last);//刪除指定迭代器中間的元素,左閉右開
//例如:a.erase(a.begin()+1, a.begin()+3);

2 vec.clear-清空vec中的元素

將容器里的內(nèi)容清空拧晕,size值為0隙姿,但是存儲(chǔ)空間沒有改變

a.clear();

3 vec.pop_back-刪除尾部元素

a.pop_back();         //刪除a向量的最后一個(gè)元素

基本操作-查找/修改元素

1 vec.assign-重新賦值

將丟棄原來的元素然后重新分配元素,第一個(gè)函數(shù)是使用迭代器厂捞,第二個(gè)函數(shù)是使用4個(gè)元素输玷,每個(gè)元素的值為2

a.assign(b.begin(), b.begin()+3); //b為向量,將b的0~2個(gè)元素構(gòu)成的向量賦給a
a.assign(4,2);        //是a只含4個(gè)元素靡馁,且每個(gè)元素為2

2 vec.back-返回vec的最后一個(gè)元素

返回尾部元素的值欲鹏,與end()函數(shù)有區(qū)別,back()函數(shù)返回的是尾部元素的迭代器

vec.back()

3 vec.front-返回vec的第一個(gè)元素

返回第一個(gè)元素的值臭墨,與begin()函數(shù)有區(qū)別赔嚎,begin()函數(shù)返回的是第一個(gè)元素的迭代器

vec.front()

4 vec[i]-下標(biāo)訪問修改

// vector::operator[]
#include <iostream>
#include <vector>

int main ()
{
  std::vector<int> myvector (10);   // 10 zero-initialized elements

  std::vector<int>::size_type sz = myvector.size();

  // assign some values:
  for (unsigned i=0; i<sz; i++) myvector[i]=i;

  // reverse vector using operator[]:
  for (unsigned i=0; i<sz/2; i++)
  {
    int temp;
    temp = myvector[sz-1-i];
    myvector[sz-1-i]=myvector[i];
    myvector[i]=temp;
  }

  std::cout << "myvector contains:";
  for (unsigned i=0; i<sz; i++)
    std::cout << ' ' << myvector[i];
  std::cout << '\n';

  return 0;
}

5 at-訪問元素

在函數(shù)的操作方面和下標(biāo)訪問元素一樣,不同的是當(dāng)這個(gè)函數(shù)越界時(shí)會(huì)拋出一個(gè)異常out_of_range

// vector::at
#include <iostream>
#include <vector>

int main ()
{
  std::vector<int> myvector (10);   // 10 zero-initialized ints

  // assign some values:
  for (unsigned i=0; i<myvector.size(); i++)
    myvector.at(i)=i;

  std::cout << "myvector contains:";
  for (unsigned i=0; i<myvector.size(); i++)
    std::cout << ' ' << myvector.at(i);
  std::cout << '\n';

  return 0;
}

6 swap-交換

交換這兩個(gè)容器的內(nèi)容裙犹,這涉及到存儲(chǔ)空間的重新分配

// swap vectors
#include <iostream>
#include <vector>

int main ()
{
  std::vector<int> foo (3,100);   // three ints with a value of 100
  std::vector<int> bar (5,200);   // five ints with a value of 200

  foo.swap(bar);

  std::cout << "foo contains:";
  for (unsigned i=0; i<foo.size(); i++)
    std::cout << ' ' << foo[i];
  std::cout << '\n';

  std::cout << "bar contains:";
  for (unsigned i=0; i<bar.size(); i++)
    std::cout << ' ' << bar[i];
  std::cout << '\n';

  return 0;
}

基本操作-迭代器

1 vec.begin/vec.end-迭代器

// vector::begin/end
#include <iostream>
#include <vector>

int main ()
{
  std::vector<int> myvector;
  for (int i=1; i<=5; i++) myvector.push_back(i);

  std::cout << "myvector contains:";
  for (std::vector<int>::iterator it = myvector.begin() ; it != myvector.end(); ++it)
    std::cout << ' ' << *it;
  std::cout << '\n';

  return 0;
}

2 vec.cbegin/vec.cend-常量迭代器

返回一個(gè)類型為cont::const_iterator 的對(duì)象


// vector::cbegin/cend
#include <iostream>
#include <vector>

int main ()
{
  std::vector<int> myvector = {10,20,30,40,50};

  std::cout << "myvector contains:";

  for (auto it = myvector.cbegin(); it != myvector.cend(); ++it)
    std::cout << ' ' << *it;
  std::cout << '\n';

  return 0;
}

算法操作

需要頭文件#include<algorithm>

1 sort-排序

sort(a.begin(),a.end());     //對(duì)a中的從a.begin()(包括它)到a.end()(不包括它)的元素進(jìn)行從小到大排列

2 reverse-翻轉(zhuǎn)

使用reverse將元素翻轉(zhuǎn)

reverse(a.begin(),a.end()); //對(duì)a中的從a.begin()(包括它)到a.end()(不包括它)的元素倒置尽狠,但不排列,如a中元素為1,3,2,4,倒置后為4,2,3,1

3 copy-復(fù)制

copy(a.begin(),a.end(),b.begin()+1); //把a(bǔ)中的從a.begin()(包括它)到a.end()(不包括它)的元素復(fù)制到b中叶圃,從b.begin()+1的位置(包括它)開        始復(fù)制袄膏,覆蓋掉原有元素

4 find-查找

find(a.begin(),a.end(),10); //在a中的從a.begin()(包括它)到a.end()(不包括它)的元素中查找10,若存在返回其在向量中的位置

常用操作

使用迭代器遍歷容器

vector<int>::iterator it;
for(it=vec.begin();it!=vec.end();it++){
vec[it]=0;
}

auto遍歷

for (auto& x : vec)
        std::cout << ' ' << x;

參考

http://www.cplusplus.com/reference/vector/vector/

https://blog.csdn.net/happy987818/article/details/54944132

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末掺冠,一起剝皮案震驚了整個(gè)濱河市沉馆,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌德崭,老刑警劉巖斥黑,帶你破解...
    沈念sama閱讀 211,948評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異眉厨,居然都是意外死亡锌奴,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門憾股,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鹿蜀,“玉大人,你說我怎么就攤上這事服球≤钋。” “怎么了?”我有些...
    開封第一講書人閱讀 157,490評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵斩熊,是天一觀的道長(zhǎng)往枣。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么分冈? 我笑而不...
    開封第一講書人閱讀 56,521評(píng)論 1 284
  • 正文 為了忘掉前任圾另,我火速辦了婚禮,結(jié)果婚禮上雕沉,老公的妹妹穿的比我還像新娘盯捌。我一直安慰自己,他們只是感情好蘑秽,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,627評(píng)論 6 386
  • 文/花漫 我一把揭開白布饺著。 她就那樣靜靜地躺著,像睡著了一般肠牲。 火紅的嫁衣襯著肌膚如雪幼衰。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,842評(píng)論 1 290
  • 那天缀雳,我揣著相機(jī)與錄音渡嚣,去河邊找鬼。 笑死肥印,一個(gè)胖子當(dāng)著我的面吹牛识椰,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播深碱,決...
    沈念sama閱讀 38,997評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼腹鹉,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了敷硅?” 一聲冷哼從身側(cè)響起功咒,我...
    開封第一講書人閱讀 37,741評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎绞蹦,沒想到半個(gè)月后力奋,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,203評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡幽七,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,534評(píng)論 2 327
  • 正文 我和宋清朗相戀三年景殷,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片澡屡。...
    茶點(diǎn)故事閱讀 38,673評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡猿挚,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出挪蹭,到底是詐尸還是另有隱情亭饵,我是刑警寧澤休偶,帶...
    沈念sama閱讀 34,339評(píng)論 4 330
  • 正文 年R本政府宣布梁厉,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏词顾。R本人自食惡果不足惜八秃,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,955評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望肉盹。 院中可真熱鬧昔驱,春花似錦、人聲如沸上忍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)窍蓝。三九已至腋颠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間吓笙,已是汗流浹背淑玫。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留面睛,地道東北人絮蒿。 一個(gè)月前我還...
    沈念sama閱讀 46,394評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像叁鉴,于是被迫代替她去往敵國(guó)和親土涝。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,562評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容

  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy閱讀 9,511評(píng)論 1 51
  • 容器 在實(shí)際的開發(fā)過程中茵肃, 數(shù)據(jù)結(jié)構(gòu)本身的重要性不會(huì)遜于操作于數(shù)據(jù)結(jié)構(gòu)的算法的重要性, 當(dāng)程序中存在著對(duì)時(shí)間要求很...
    編程小兔崽閱讀 1,074評(píng)論 0 1
  • 標(biāo)簽(空格分隔): STL 運(yùn)用STL袭祟,可以充分利用該庫(kù)的設(shè)計(jì)验残,讓我為簡(jiǎn)單而直接的問題設(shè)計(jì)出簡(jiǎn)單而直接的解決方案,...
    認(rèn)真學(xué)計(jì)算機(jī)閱讀 1,473評(píng)論 0 10
  • 是曾經(jīng)相見過 在茫茫的人海中 在寂靜的村野外 也許只是在擦肩而過的回眸里 我們?cè)跓熡甑某鞘欣锵嘤鲞^ 你舉眉輕笑走...
    秦南子閱讀 450評(píng)論 0 51
  • 你是一條小河 靜靜的從我身邊流過 我無意間的一瞥 揉進(jìn)了你的微波 是什么讓你回旋婉轉(zhuǎn) 又是什么使我身影婆娑 本來閑...
    四字真言閱讀 463評(píng)論 2 4