ACM C STL 之vector常見用法

2021-08-15 08:51:55 字數 3839 閱讀 4182

stl是簡單效率不錯的工具,尤其幾種容器都蠻方便的,掌握好能發揮不錯的威力。讓你更多的時間去思考解題思路,而不是每次都要寫奇奇怪怪的**模擬簡單的功能,讓整體**變的臃腫,想象一下不可能每次排序要自己寫把。 總得來說看能使**思路清晰,簡潔。所以我們很有必須學習和掌握基本的stl使用方法。

這裡先總結下vector常用的用法。

為了使用vector 首先:

#include //很方便的標頭檔案 

using namespace std; //做題的話建議寫,方便嘛

定義的常用方式:

vectorv;

//定義乙個空的動態陣列,儲存int型別元素

vectorv(5);

//定義乙個初始大小為5的動態陣列(預設初始值都為0),儲存int型別元素

vectorv(5,1);

//定義乙個初始大小為5的動態陣列,賦值都為1,儲存int型別元素

基本操作:

v[i]; // 以下標方式訪問元素,很方便.

v.push_back(x); //往尾部插入元素x (常用)

v.insert(it, x); //向迭代器it指向的位置插入x,原位置後移 (蠻方便的,速度也快)。

//舉例:v.insert(v.begin(),1); 比較神奇5w次這樣的操作 大概0.5s,自己寫的o(n)函式大概2.5s

v.size();//返回表長,注意是unsigned型別,如果v.size()為1,減去2就是乙個很大的正整數數,看情況轉(int)v.size()

v.begin(); // 返回指向首元素的迭代器 

v.end();    // 返回指向尾元素下乙個位置的迭代器.

v.front(); //取首元素的值 

v.back(); // 取尾元素的值

v.empty(); //表為空返回真,否則返回假

v.clear(); //清空表中所有元素

v.pop_back(); // 刪除表尾元素

v.erase(it); //刪除迭代器it指向的元素

v.erase(st, ed); //刪除迭代器st和ed指定的元素[st,ed) (左閉右開)

v.reserve(x); //預分配空間大小為x.

用到vector自然少不了常用的排序sort,那麼排序方法有如下幾種:

(sort的第三個引數是乙個函式指標或乙個函式物件,不寫就使用預設(自己定義的結構體要排序必須要寫比較規則) )

一:預設或使用標準庫函式

乙個引數

vectorv;

sort(v.begin(), v.end()); //預設,從小到大

sort(v.begin(), v.end(), greater()); //從大到小,降序排列

sort(v.begin(), v.end(), less()); // 從小到大,公升序排列

兩個引數(不想寫結構體的話可以用pair)

vector>v; //pair實質上是乙個結構體,其主要的兩個成員變數是first和second

v.push_back(make_pair(3,4)); //用make_pair來構造我們需要的pair.

v.push_back(make_pair(4,5));

sort(v.begin(), v.end()); //預設,按第乙個數公升序排列,若相同則按第二個數公升序。

sort(v.begin(), v.end(), greater>()); //按第乙個數降序排列,若相同按第二個數降序。

sort(v.begin(), v.end(), less>()); // 同預設

cout << v[0].first << " " << v[0].second; // 用v[i].first 和 v[i].second 取值

多個引數(當然你想要花裡胡哨也可以寫 vector,int> >v; … 但還是建議寫結構體把。

二:  自定義比較函式(常用)

一般形式:

vectorv; 

bool cmp(int a, int b)

sort(v.begin(),v.end(), cmp);

結構體的話類似:

#include using namespace std;

struct test

};vectorv;

bool cmp(test a, test b)

int main(void )

三 :過載結構體或類的比較運算子

//情況一:在結構體內部過載

#include using namespace std;

struct test

friend bool operator < (test a, test b)

/*或(也可以加上const &更規範,比如在第三個引數寫less()時,必須按標準格式寫)

bool operator < (const test &a)const

*/};vectorv;

int main(void )

//情況二:在外部過載

#include using namespace std;

struct test

};bool operator < (test a,test b)

vectorv;

int main(void )

補充下

過載pair,寫在全域性裡無效,主

要原因是不在乙個namespace中,

是先在同名字空間下里找,沒找到才會外面找

#include using namespace std;

#define pb push_back

#define mp make_pair

namespace std

bool operator > (const pair&a, const pair&b)

}vector> v;

int main()

四 :使用仿函式

#include using namespace std;

struct test

};vectorv;

struct cmp

};int main(void )

五 其他常用

swap(v[1], v[2]); //交換元素.

reverse(v.begin(), v.end()); //反轉1234 -> 4321

*max_element(v.begin(), v.end()); //找表裡最大的數

*min_element(v.begin(), v.end()); //找表裡最小的數

lower_bound(v.begin(), v.end(), x) - v.begin(); //二分法找第乙個 大於等於x的下標

upper_bound(v.begin(), v.end(), x) - v.begin(); //二分法找第乙個 大於x的下標

v.erase(unique(v.begin(), v.end()), v.end());//去重,1220330770.結果是1203070。一般是排序、去重、離散化時用到.

vector >e[maxn]; // 一種建圖思路.e[i][j] i為源點,e[i][j].first為第j條邊終點, .second為距離

C 之常物件,常物件成員

一.常物件 1.常物件定義 time const t1 1,2,3 或者const time t1 2.常物件不能呼叫該物件的非const型的成員函式 系統主動呼叫的構造析構函式除外 3.常成員函式的宣告方法,後面加個const即可 void get time const 4.常物件不能修改物件內的...

C 之常物件 常成員變數與常成員函式詳解

一 常物件說明 常物件是指物件的資料成員的值在物件被呼叫時不能被改變。常物件必須進行初始化,且 能被更新。不能通過常物件呼叫普通成員函式,但是可以通過普通物件呼叫常成員函式。常物件只能呼叫常成員函式。常物件的宣告如下 const 類名 物件名 類名 const 物件名 兩種宣告完全一樣沒有任何區別。...

C 之常物件,常成員物件,常成員函式,常指標

一 常物件 time const t1 12,23,23 其中所有的值不能被修改。通過該物件只能呼叫它的常成員函式,而不能呼叫它的普通成員函式。以防普通成員函式會修改資料成員的值。但如果一定要修改常物件資料成員的值,可以將該資料成員宣告為mutable,如 mutable int count 把co...