日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

c++中vector使用说明

發(fā)布時間:2023/12/18 c/c++ 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c++中vector使用说明 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、向量的介紹
?? ?向量?vector?是一種對象實體, 能夠容納許多其他類型相同的元素, 因此又被稱為容器。 與string相同, vector 同屬于STL(Standard Template Library, 標準模板庫)中的一種自定義的數(shù)據(jù)類型, 可以廣義上認為是數(shù)組的增強版。
?? ?
?? ?在使用它時, 需要包含頭文件 vector,?#include<vector>
?? ?
?? ?vector 容器與數(shù)組相比其優(yōu)點在于它能夠根據(jù)需要隨時自動調(diào)整自身的大小以便容下所要放入的元素。此外, vector 也提供了許多的方法來對自身進行操作。
?? ?
?? ?

?


二、向量的聲明及初始化
?? ?vector 型變量的聲明以及初始化的形式也有許多, 常用的有以下幾種形式:

vector<int> a ; //聲明一個int型向量avector<int> a(10) ; //聲明一個初始大小為10的向量vector<int> a(10, 1) ; //聲明一個初始大小為10且初始值都為1的向量vector<int> b(a) ; //聲明并用向量a初始化向量bvector<int> b(a.begin(), a.begin()+3) ; //將a向量中從第0個到第2個(共3個)作為向量b的初始值

?? ?????
?? ?除此之外, 還可以直接使用數(shù)組來初始化向量:

int n[] = {1, 2, 3, 4, 5} ;vector<int> a(n, n+5) ; //將數(shù)組n的前5個元素作為向量a的初值vector<int> a(&n[1], &n[4]) ; //將n[1] - n[4]范圍內(nèi)的元素作為向量a的初值

?


?? ??? ?
?? ??? ?
三、元素的輸入及訪問
?? ?元素的輸入和訪問可以像操作普通的數(shù)組那樣, 用cin>>進行輸入,?cout<<a[n]這樣進行輸出:
?? ?示例:

1 #include<iostream>2 #include<vector>3 4 using namespace std ;5 6 int main()7 {8 vector<int> a(10, 0) ; //大小為10初值為0的向量a9 10 //對其中部分元素進行輸入 11 cin >>a[2] ; 12 cin >>a[5] ; 13 cin >>a[6] ; 14 15 //全部輸出 16 int i ; 17 for(i=0; i<a.size(); i++) 18 cout<<a[i]<<" " ; 19 20 return 0 ; 21 }

????
?? ?在元素的輸出上, 還可以使用遍歷器(又稱迭代器)進行輸出控制。在?vector<int> b(a.begin(), a.begin()+3) ;?這種聲明形式中,?(a.begin()、a.begin()+3)?表示向量起始元素位置到起始元素+3之間的元素位置。(a.begin(), a.end())則表示起始元素和最后一個元素之外的元素位置。
?? ?向量元素的位置便成為遍歷器, 同時, 向量元素的位置也是一種數(shù)據(jù)類型, 在向量中遍歷器的類型為:?vector<int>::iterator。 遍歷器不但表示元素位置, 還可以再容器中前后移動。
?? ?
?? ?在上例中講元素全部輸出部分的代碼就可以改寫為:

//全部輸出vector<int>::iterator t ;for(t=a.begin(); t!=a.end(); t++)cout<<*t<<" " ;

?? ?????
?? ?*t?為指針的間接訪問形式, 意思是訪問t所指向的元素值。
?? ?
?? ?

?


四、向量的基本操作

1>. a.size() //獲取向量中的元素個數(shù)2>. a.empty() //判斷向量是否為空3>. a.clear() //清空向量中的元素4>. 復(fù)制a = b ; //將b向量復(fù)制到a向量中5>. 比較保持 ==、!=、>、>=、<、<= 的慣有含義 ;如: a == b ; //a向量與b向量比較, 相等則返回16>. 插入 - insert①、 a.insert(a.begin(), 1000); //將1000插入到向量a的起始位置前②、 a.insert(a.begin(), 3, 1000) ; //將1000分別插入到向量元素位置的0-2處(共3個元素)③、 vector<int> a(5, 1) ;vector<int> b(10) ;b.insert(b.begin(), a.begin(), a.end()) ; //將a.begin(), a.end()之間的全部元素插入到b.begin()前7>. 刪除 - erase①、 b.erase(b.begin()) ; //將起始位置的元素刪除②、 b.erase(b.begin(), b.begin()+3) ; //將(b.begin(), b.begin()+3)之間的元素刪除8>. 交換 - swapb.swap(a) ; //a向量與b向量進行交換

?


?? ??? ?
?? ??? ?
五、二維向量
?? ?與數(shù)組相同, 向量也可以增加維數(shù), 例如聲明一個m*n大小的二維向量方式可以像如下形式:

vector< vector<int> > b(10, vector<int>(5)); //創(chuàng)建一個10*5的int型二維向量

?
?? ?在這里, 實際上創(chuàng)建的是一個向量中元素為向量的向量。同樣可以根據(jù)一維向量的相關(guān)特性對二維向量進行操作。
?? ?
?? ?:

1 #include<iostream>2 #include<vector>3 4 using namespace std ;5 6 int main()7 {8 vector< vector<int> > b(10, vector<int>(5, 0)) ;9 10 //對部分數(shù)據(jù)進行輸入 11 cin>>b[1][1] ; 12 cin>>b[2][2] ; 13 cin>>b[3][3]; 14 15 //全部輸出 16 int m, n ; 17 for(m=0; m<b.size(); m++) //b.size()獲取行向量的大小 18 { 19 for(n=0; n<b[m].size(); n++) //獲取向量中具體每個向量的大小 20 cout<<b[m][n]<<" " ; 21 cout<<"\n" ; 22 } 23 24 return 0; 25 }

?? ?
?? ?同樣, 按照這樣的思路我們還可以創(chuàng)建更多維的向量, 不過維數(shù)太多會讓向量變得難以靈活控制, 三維以上的向量還需酌情使用。

___________________________________________________________________________________________________________________________________________________________________

1. 在C++中的詳細說明
vector是C++標準模板庫中的部分內(nèi)容,它是一個多功能的,能夠操作多種數(shù)據(jù)結(jié)構(gòu)和算法的模板類和函數(shù)庫。
vector之所以被認為是一個容器,是因為它能夠像容器一樣存放各種類型的對象,
簡單地說,vector是一個能夠存放任意類型的動態(tài)數(shù)組,能夠增加和壓縮數(shù)據(jù)。


2. 使用vector,
必須在你的頭文件中包含下面的代碼:
? #include?


vector屬于std命名域的,因此需要通過命名限定,如下完成你的代碼:
  using std::vector;
  vector?vInts;
  
或者連在一起,使用全名: ?
? ? std::vector?vInts;
  
建議使用全局的命名域方式:
? ? using namespace std;


3. 初始化 ??
vector?? ? ? ? ? ? ? ? // 創(chuàng)建一個空的vector。
vector?c1(c2) ? ? ? ? ?// 復(fù)制一個vector
vector?c(n) ? ? ? ? ? ?// 創(chuàng)建一個vector,含有n個數(shù)據(jù),數(shù)據(jù)均已缺省構(gòu)造產(chǎn)生
vector?c(n, elem) ? ? ?// 創(chuàng)建一個含有n個elem拷貝的vector
vector?c(beg,end) ? ? ?// 創(chuàng)建一個含有n個elem拷貝的vector


4. 析構(gòu)函數(shù)
c.~vector?() ? ? ? ? ? // 銷毀所有數(shù)據(jù),釋放內(nèi)存


5. 成員函數(shù)
c.assign(beg,end)c.assign(n,elem)
  將[beg; end)區(qū)間中的數(shù)據(jù)賦值給c。將n個elem的拷貝賦值給c。
c.at(idx)
  傳回索引idx所指的數(shù)據(jù),如果idx越界,拋出out_of_range。


c.back() ? ? ?// 傳回最后一個數(shù)據(jù),不檢查這個數(shù)據(jù)是否存在。
c.begin() ? ? // 傳回迭代器中的第一個數(shù)據(jù)地址。
c.capacity() ?// 返回容器中數(shù)據(jù)個數(shù)。
c.clear() ? ? // 移除容器中所有數(shù)據(jù)。
c.empty() ? ? // 判斷容器是否為空。
c.end() ? ? ? // 指向迭代器中末端元素的下一個,指向一個不存在元素。
c.erase(pos) ?// 刪除pos位置的數(shù)據(jù),傳回下一個數(shù)據(jù)的位置。
c.erase(beg,end) ?//刪除[beg,end)區(qū)間的數(shù)據(jù),傳回下一個數(shù)據(jù)的位置。
c.front() ? ? // 傳回第一個數(shù)據(jù)。


get_allocator // 使用構(gòu)造函數(shù)返回一個拷貝。


c.insert(pos,elem) ? ?// 在pos位置插入一個elem拷貝,傳回新數(shù)據(jù)位置。
c.insert(pos,n,elem) ?// 在pos位置插入n個elem數(shù)據(jù)。無返回值。
c.insert(pos,beg,end) // 在pos位置插入在[beg,end)區(qū)間的數(shù)據(jù)。無返回值。
  
c.max_size() ? ? ? // 返回容器中最大數(shù)據(jù)的數(shù)量。
c.pop_back() ? ? ? // 刪除最后一個數(shù)據(jù)。
c.push_back(elem) ?// 在尾部加入一個數(shù)據(jù)。
c.rbegin() ? ? ? ? // 傳回一個逆向隊列的第一個數(shù)據(jù)。
c.rend() ? ? ? ? ? // 傳回一個逆向隊列的最后一個數(shù)據(jù)的下一個位置。
c.resize(num) ? ? ?// 重新指定隊列的長度。
c.reserve() ? ? ? ?// 保留適當(dāng)?shù)娜萘俊?br /> c.size() ? ? ? ? ? // 返回容器中實際數(shù)據(jù)的個數(shù)。
c1.swap(c2)
swap(c1,c2) ? ? ? ?// 將c1和c2元素互換。同上操作。

operator[] ? ? ? ? // 返回容器中指定位置的一個引用。

6. 用法示例:
6.1. 創(chuàng)建一個vector
vector容器提供了多種創(chuàng)建方法,下面介紹幾種常用的。
創(chuàng)建一個Widget類型的空的vector對象:
  vector?vWidgets;
  
創(chuàng)建一個包含500個Widget類型數(shù)據(jù)的vector:
  vector?vWidgets(500);
  
創(chuàng)建一個包含500個Widget類型數(shù)據(jù)的vector,并且都初始化為0:
  vector?vWidgets(500, Widget(0));
  
創(chuàng)建一個Widget的拷貝:
  vector?vWidgetsFromAnother(vWidgets);
  
向vector添加一個數(shù)據(jù)
  vector添加數(shù)據(jù)的缺省方法是push_back()。
? ? push_back()函數(shù)表示將數(shù)據(jù)添加到vector的尾部,并按需要來分配內(nèi)存。


例如:向vector中添加10個數(shù)據(jù),需要如下編寫代碼:
  for(int i= 0;i<10; i++) {
   ?vWidgets.push_back(Widget(i));
  }


6.2 獲取vector中指定位置的數(shù)據(jù)
  vector里面的數(shù)據(jù)是動態(tài)分配的,使用push_back()的一系列分配空間常常決定于文件或一些數(shù)據(jù)源。
? ? 如果想知道vector存放了多少數(shù)據(jù),可以使用empty()。
? ? 獲取vector的大小,可以使用size()。


例如,如果想獲取一個vector v的大小,但不知道它是否為空,或者已經(jīng)包含了數(shù)據(jù),如果為空想設(shè)置為-1,
你可以使用下面的代碼實現(xiàn):
  int nSize = v.empty() ? -1 : static_cast(v.size());
  
6.3 訪問vector中的數(shù)據(jù)
使用兩種方法來訪問vector。
1、 vector::at()
2、 vector::operator[]
  operator[]主要是為了與C語言進行兼容。它可以像C語言數(shù)組一樣操作。
? ? 但at()是我們的首選,因為at()進行了邊界檢查,如果訪問超過了vector的范圍,將拋出一個例外。
? ? 由于operator[]容易造成一些錯誤,所有我們很少用它,下面進行驗證一下:
  
分析下面的代碼:
  vector?v;
  v.reserve(10);
  
? ? for(int i=0; i<7; i++) {
   ?v.push_back(i);
  }
  
? ? try {int iVal1 = v[7];
   ?// not bounds checked - will not throw
   ?int iVal2 = v.at(7);
   ?// bounds checked - will throw if out of range
  }?
? ??
? ? catch(const exception& e) {
   ?cout << e.what();
  }
  
6.3 刪除vector中的數(shù)據(jù)
vector能夠非常容易地添加數(shù)據(jù),也能很方便地取出數(shù)據(jù),
同樣vector提供了erase(),pop_back(),clear()來刪除數(shù)據(jù),
當(dāng)刪除數(shù)據(jù)時,應(yīng)該知道要刪除尾部的數(shù)據(jù),或者是刪除所有數(shù)據(jù),還是個別的數(shù)據(jù)。

Remove_if()算法 如果要使用remove_if(),需要在頭文件中包含如下代碼::
  #include?

Remove_if()有三個參數(shù):
  1、 iterator _First:指向第一個數(shù)據(jù)的迭代指針。
  2、 iterator _Last:指向最后一個數(shù)據(jù)的迭代指針。
  3、 predicate _Pred:一個可以對迭代操作的條件函數(shù)。
  
6.4 條件函數(shù)
條件函數(shù)是一個按照用戶定義的條件返回是或否的結(jié)果,是最基本的函數(shù)指針,或是一個函數(shù)對象。
這個函數(shù)對象需要支持所有的函數(shù)調(diào)用操作,重載operator()()操作。
remove_if()是通過unary_function繼承下來的,允許傳遞數(shù)據(jù)作為條件。


例如,假如想從一個vector中刪除匹配的數(shù)據(jù),如果字串中包含了一個值,從這個值開始,從這個值結(jié)束。
首先應(yīng)該建立一個數(shù)據(jù)結(jié)構(gòu)來包含這些數(shù)據(jù),類似代碼如下:
#include?
enum findmodes {
? FM_INVALID = 0,
? FM_IS,
 FM_STARTSWITH,
 FM_ENDSWITH,
 FM_CONTAINS
};

typedef struct tagFindStr {
 UINT iMode;
 CString szMatchStr;
} FindStr;


typedef FindStr* LPFINDSTR;
  
然后處理條件判斷:
class FindMatchingString : public std::unary_function<cstring, bool="">?{
public:
 FindMatchingString(const LPFINDSTR lpFS) :
 m_lpFS(lpFS) {}
 bool operator()(CString& szStringToCompare) const {
  bool retVal = false;
  
? ? switch (m_lpFS->iMode) {
  case FM_IS: {
   ?retVal = (szStringToCompare == m_lpFDD->szMatchStr);
   ?break;
  }
  case FM_STARTSWITH: {
   ?retVal = (szStringToCompare.Left(m_lpFDD->szMatchStr.GetLength())
   ? ?== m_lpFDD->szWindowTitle);
   ?break;
  }
  case FM_ENDSWITH: {
   ?retVal = (szStringToCompare.Right(m_lpFDD->szMatchStr.GetLength())
   ? ?== m_lpFDD->szMatchStr);
  break;
  }
  case FM_CONTAINS: {
   ?retVal = (szStringToCompare.Find(m_lpFDD->szMatchStr) != -1);
   ?break;
  }
  ?}
  ?return retVal;
? }
private:
 LPFINDSTR m_lpFS;
};

通過這個操作你可以從vector中有效地刪除數(shù)據(jù):
? ? FindStr fs;
  fs.iMode = FM_CONTAINS;
  fs.szMatchStr = szRemove;
  vs.erase(std::remove_if(vs.begin(), vs.end(), FindMatchingString(&fs)), vs.end());
  
Remove(),remove_if()等所有的移出操作都是建立在一個迭代范圍上的,不能操作容器中的數(shù)據(jù)。
所以在使用remove_if(),實際上操作的時容器里數(shù)據(jù)的上面的。


看到remove_if()實際上是根據(jù)條件對迭代地址進行了修改,在數(shù)據(jù)的后面存在一些殘余的數(shù)據(jù),
那些需要刪除的數(shù)據(jù)。剩下的數(shù)據(jù)的位置可能不是原來的數(shù)據(jù),但他們是不知道的。
調(diào)用erase()來刪除那些殘余的數(shù)據(jù)。
注意上面例子中通過erase()刪除remove_if()的結(jié)果和vs.enc()范圍的數(shù)據(jù)。


7. 綜合例子:
//---------------------------------------------------------------------------
#include?
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------

#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
#include?
#include?
using namespace std;

struct STResult
{
? ? double Time;
? ? double Xp;
? ? double Yp;
? ? int id;
};


//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
? ? : TForm(Owner)
{
}


vector?ResultVector;


void __fastcall test()
{
? ? //test
? ? //vector?ResultVector;
? ? STResult stritem;
? ? stritem.Time = .1;
? ? stritem.Xp = .1;
? ? stritem.Yp = .1;
? ? stritem.id = 1;


? ? ResultVector.push_back( stritem );


}


//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
? ? test();
? ? assert(ResultVector[0].id == 1);
}
//---------------------------------------------------------------------------

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎

總結(jié)

以上是生活随笔為你收集整理的c++中vector使用说明的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。