C/C++学习之路: STL
生活随笔
收集整理的這篇文章主要介紹了
C/C++学习之路: STL
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
C/C++學習之路: STL
目錄
1. STL概述
1. STL六大組件簡介
2. STL優點
2. STL三大組件
1. 容器
2. 算法
3. 迭代器
| 輸入迭代器 | 提供對數據的只讀訪問 |
| 輸出迭代器 | 提供對數據的只寫訪問 |
| 前向迭代器 | 提供讀寫操作,并能向前推進迭代器 |
| 雙向迭代器 | 提供讀寫操作,并能向前和向后操作 |
| 隨機訪問迭代器 | 提供讀寫操作,并能在數據中隨機移動 |
3. 常用容器
1. string容器
1. string容器基本概念
2. string容器常用操作
1. string 構造函數
string s1(); // si = "" string s2("Hello"); // s2 = "Hello" string s3(4, 'K'); // s3 = "KKKK" string s4("12345", 1, 3); //s4 = "234",即 "12345" 的從下標 1 開始,長度為 3 的子串2. string基本賦值操作
3. 求字符串的長度
4. string對象中字符串的連接
除了可以使用+和+=運算符對 string 對象執行字符串的連接操作外,string 類還有 append 成員函數,可以用來向字符串后面添加內容。append 成員函數返回對象自身的引用。例如:
string s1("123"), s2("abc"); s1.append(s2); // s1 = "123abc" s1.append(s2, 1, 2); // s1 = "123abcbc" s1.append(3, 'K'); // s1 = "123abcbcKKK" s1.append("ABCDE", 2, 3); // s1 = "123abcbcKKKCDE",添加 "ABCDE" 的子串(2, 3)5. string查找和替換
6. string比較操作
7. string子串
8. string插入和刪除操作
9. string和c-style字符串轉換
//string 轉 char* string str = "itcast"; const char* cstr = str.c_str(); //char* 轉 string char* s = "itcast"; string sstr(s);10. 交換兩個string對象的內容
11. 將 string 對象作為流處理
使用流對象 istringstream 和 ostringstream,可以將 string 對象當作一個流進行輸入輸出。使用這兩個類需要包含頭文件 sstream。
示例程序如下:
12. 用 STL 算法操作 string 對象
2. vector
1. vector迭代器
2. vector數據結構
3. vector常用api操作
1. vector構造函數
vector<T> v; //采用模板實現類實現,默認構造函數 vector(v.begin(), v.end());//將v[begin(), end())區間中的元素拷貝給本身。 vector(n, elem);//構造函數將n個elem拷貝給本身。 vector(const vector &vec);//拷貝構造函數。//例子 使用第二個構造函數 int arr[] = {2,3,4,1,9}; vector<int> v1(arr, arr + sizeof(arr) / sizeof(int)); // 使用第三個構造函數 vector<int> v2(10,6);2. vector常用賦值操作
assign(beg, end);//將[beg, end)區間中的數據拷貝賦值給本身。 assign(n, elem);//將n個elem拷貝賦值給本身。 vector&operator=(const vector &vec);//重載等號操作符 swap(vec);// 將vec與本身的元素互換。vector<int> v;v.assign(10,6);v.swap(v2);3. vector大小操作
size();//返回容器中元素的個數 empty();//判斷容器是否為空 resize(int num);//重新指定容器的長度為num,若容器變長,則以默認值填充新位置。如果容器變短,則末尾超出容器長度的元素被刪除。 resize(int num, elem);//重新指定容器的長度為num,若容器變長,則以elem值填充新位置。如果容器變短,則末尾超出容器長>度的元素被刪除。 capacity();//容器的容量 reserve(int len);//容器預留len個元素長度,預留位置不初始化,元素不可訪問。4. vector數據存取操作
at(int idx); //返回索引idx所指的數據,如果idx越界,拋出out_of_range異常。 operator[];//返回索引idx所指的數據,越界時,運行直接報錯 front();//返回容器中第一個數據元素 back();//返回容器中最后一個數據元素5. vector插入和刪除操作
insert(const_iterator pos, int count,ele);//迭代器指向位置pos插入count個元素ele. push_back(ele); //尾部插入元素ele pop_back();//刪除最后一個元素 erase(const_iterator start, const_iterator end);//刪除迭代器從start到end之間的元素 erase(const_iterator pos);//刪除迭代器指向的元素 clear();//刪除容器中所有元素4. vector案例
1. 使用swap,收縮內存空間
#define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<vector> usingnamespace std;int main(){vector<int> v;for(int i =0; i <100000;i ++){v.push_back(i);}cout <<"capacity:"<< v.capacity()<< endl;cout <<"size:"<< v.size()<< endl;//此時 通過resize改變容器大小v.resize(10);cout <<"capacity:"<< v.capacity()<< endl;cout <<"size:"<< v.size()<< endl;//容量沒有改變vector<int>(v).swap(v);cout <<"capacity:"<< v.capacity()<< endl;cout <<"size:"<< v.size()<< endl;system("pause");return EXIT_SUCCESS; }2. reserve 預留空間
#define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<vector> usingnamespace std;int main(){vector<int> v;//預先開辟空間v.reserve(100000);int* pStart =NULL;int count =0;for(int i =0; i <100000;i ++){v.push_back(i);if(pStart !=&v[0]){pStart =&v[0];count++;}}cout <<"count:"<< count << endl;system("pause");return EXIT_SUCCESS; }3. deque
1. deque容器實現原理
2. deque常用api操作
1. deque構造函數
deque<T> deqT;//默認構造形式 deque(beg, end);//構造函數將[beg, end)區間中的元素拷貝給本身。 deque(n, elem);//構造函數將n個elem拷貝給本身。 deque(const deque &deq);//拷貝構造函數。2. deque賦值操作
assign(beg, end);//將[beg, end)區間中的數據拷貝賦值給本身。 assign(n, elem);//將n個elem拷貝賦值給本身。 deque&operator=(const deque &deq); //重載等號操作符 swap(deq);// 將deq與本身的元素互換3. deque大小操作
deque.size();//返回容器中元素的個數 deque.empty();//判斷容器是否為空 deque.resize(num);//重新指定容器的長度為num,若容器變長,則以默認值填充新位置。如果容器變短,則末尾超出容器長度的元素被刪除。 deque.resize(num, elem); //重新指定容器的長度為num,若容器變長,則以elem值填充新位置,如果容器變短,則末尾超出容器長度的元素被刪除。4. deque雙端插入和刪除操作
push_back(elem);//在容器尾部添加一個數據 push_front(elem);//在容器頭部插入一個數據 pop_back();//刪除容器最后一個數據 pop_front();//刪除容器第一個數據5. deque雙端插入和刪除操作
at(idx);//返回索引idx所指的數據,如果idx越界,拋出out_of_range。 operator[];//返回索引idx所指的數據,如果idx越界,不拋出異常,直接出錯。 front();//返回第一個數據。 back();//返回最后一個數據6. deque插入操作
insert(pos,elem);//在pos位置插入一個elem元素的拷貝,返回新數據的位置。 insert(pos,n,elem);//在pos位置插入n個elem數據,無返回值。 insert(pos,beg,end);//在pos位置插入[beg,end)區間的數據,無返回值。7. deque刪除操作
clear();//移除容器的所有數據 erase(beg,end);//刪除[beg,end)區間的數據,返回下一個數據的位置。 erase(pos);//刪除pos位置的數據,返回下一個數據的位置。4. stack容器
1. stack容器基本概念
2. stack沒有迭代器
3. stack常用API
1. stack構造函數
stack<T> stkT;//stack采用模板類實現, stack對象的默認構造形式: stack(const stack &stk);//拷貝構造函數2. stack賦值操作
stack&operator=(const stack &stk);//重載等號操作符3. stack數據存取操作
push(elem);//向棧頂添加元素 pop();//從棧頂移除第一個元素 top();//返回棧頂元素4. stack大小操作
empty();//判斷堆棧是否為空 size();//返回堆棧的大小5. queue
1. queue容器基本概念
2. queue沒有迭代器
Queue所有元素的進出都必須符合”先進先出”的條件,只有queue的頂端元素,才有機會被外界取用。Queue不提供遍歷功能,也不提供迭代器。
3. queue常用API
1. queue構造函數
queue<T> queT;//queue采用模板類實現,queue對象的默認構造形式: queue(const queue &que);//拷貝構造函數2. queue存取、插入和刪除操作
push(elem);//往隊尾添加元素 pop();//從隊頭移除第一個元素 back();//返回最后一個元素 front();//返回第一個元素3. queue賦值操作
queue&operator=(const queue &que);//重載等號操作符4. queue大小操作
empty();//判斷隊列是否為空 size();//返回隊列的大小6. list容器
1. list容器基本概念
2. list容器的迭代器
List有一個重要的性質,插入操作和刪除操作都不會造成原有list迭代器的失效。這在vector是不成立的,因為vector的插入操作可能造成記憶體重新配置,導致原有的迭代器全部失效,甚至List元素的刪除,也只有被刪除的那個元素的迭代器失效,其他迭代器不受任何影響。
3. list容器的數據結構
4. list常用api
1. list構造函數
list<T> lstT;//list采用采用模板類實現,對象的默認構造形式: list(beg,end);//構造函數將[beg, end)區間中的元素拷貝給本身。 list(n,elem);//構造函數將n個elem拷貝給本身。 list(const list &lst);//拷貝構造函數。2. list數據元素插入和刪除操作
push_back(elem);//在容器尾部加入一個元素 pop_back();//刪除容器中最后一個元素 push_front(elem);//在容器開頭插入一個元素 pop_front();//從容器開頭移除第一個元素 insert(pos,elem);//在pos位置插elem元素的拷貝,返回新數據的位置。 insert(pos,n,elem);//在pos位置插入n個elem數據,無返回值。 insert(pos,beg,end);//在pos位置插入[beg,end)區間的數據,無返回值。 clear();//移除容器的所有數據 erase(beg,end);//刪除[beg,end)區間的數據,返回下一個數據的位置。 erase(pos);//刪除pos位置的數據,返回下一個數據的位置。 remove(elem);//刪除容器中所有與elem值匹配的元素。3. list大小操作
size();//返回容器中元素的個數 empty();//判斷容器是否為空 resize(num);//重新指定容器的長度為num,若容器變長,則以默認值填充新位置。如果容器變短,則末尾超出容器長度的元素被刪除。 resize(num, elem);//重新指定容器的長度為num,若容器變長,則以elem值填充新位置。如果容器變短,則末尾超出容器長度的元素被刪除。4. list賦值操作
assign(beg, end);//將[beg, end)區間中的數據拷貝賦值給本身。 assign(n, elem);//將n個elem拷貝賦值給本身。 list&operator=(const list &lst);//重載等號操作符 swap(lst);//將lst與本身的元素互換。5. list數據的存取
front();//返回第一個元素。 back();//返回最后一個元素。6. list反轉排序
reverse();//反轉鏈表,比如lst包含1,3,5元素,運行此方法后,lst就包含5,3,1元素。 sort(); //list排序7. set/multiset 容器
1. set/multiset容器基本概念
1. set容器基本概念
2. multiset容器基本概念
2. set常用API
1. set構造函數
set<T> st;//set默認構造函數: mulitset<T> mst; //multiset默認構造函數: set(const set &st);//拷貝構造函數2. set賦值操作
set&operator=(const set &st);//重載等號操作符 swap(st);//交換兩個集合容器3. set大小操作
size();//返回容器中元素的數目 empty();//判斷容器是否為空4. set插入和刪除操作
insert(elem);//在容器中插入元素。 clear();//清除所有元素 erase(pos);//刪除pos迭代器所指的元素,返回下一個元素的迭代器。 erase(beg, end);//刪除區間[beg,end)的所有元素 ,返回下一個元素的迭代器。 erase(elem);//刪除容器中值為elem的元素。5. set查找操作
find(key);//查找鍵key是否存在,若存在,返回該鍵的元素的迭代器;若不存在,返回set.end(); count(key);//查找鍵key的元素個數 lower_bound(keyElem);//返回第一個key>=keyElem元素的迭代器。 upper_bound(keyElem);//返回第一個key>keyElem元素的迭代器。 equal_range(keyElem);//返回容器中key與keyElem相等的上下限的兩個迭代器。6. set的返回值和指定set排序規則
//插入操作返回值 void test01() {set<int> s;pair<set<int>::iterator, bool> ret = s.insert(10);if (ret.second) {cout << "插入成功:" << *ret.first << endl;} else {cout << "插入失敗:" << *ret.first << endl;}s.insert(20);ret = s.insert(10);if (ret.second) {cout << "插入成功:" << *ret.first << endl;} else {cout << "插入失敗:" << *ret.first << endl;}}struct MyCompare02 {bool operator()(int v1, int v2) {return v1 > v2;} };//set從大到小 void test02() {srand((unsigned int) time(NULL));//我們發現set容器的第二個模板參數可以設置排序規則,默認規則是less<_Kty>set<int, MyCompare02> s;for (int i = 0; i < 10; i++) {s.insert(rand() % 100);}for (set<int, MyCompare02>::iterator it = s.begin(); it != s.end(); it++) {cout << *it << " ";}cout << endl; }//set容器中存放對象 class Person { public:Person(string name, int age) {this->mName = name;this->mAge = age;}public:string mName;int mAge; };struct MyCompare03 {bool operator()(const Person &p1, const Person &p2) {return p1.mAge > p2.mAge;} };void test03() {set<Person, MyCompare03> s;Person p1("aaa", 20);Person p2("bbb", 30);Person p3("ccc", 40);Person p4("ddd", 50);Person p5("ddd", 50);s.insert(p1);s.insert(p2);s.insert(p3);s.insert(p4);for (set<Person, MyCompare03>::iterator it = s.begin(); it != s.end(); it++) {cout << "Name:" << it->mName << " Age:" << it->mAge << endl;} }8. map/multimap容器
1. map/multimap基本概念
2. map/multimap常用API
1. map構造函數
map<T1, T2> mapTT;//map默認構造函數: map(const map &mp);//拷貝構造函數2. map賦值操作
map&operator=(const map &mp);//重載等號操作符 swap(mp);//交換兩個集合容器3. map大小操作
size();//返回容器中元素的數目 empty();//判斷容器是否為空4. map插入數據元素操作
map.insert(...); //往容器插入元素,返回pair<iterator,bool> map<int, string> mapStu; // 第一種 通過pair的方式插入對象 mapStu.insert(pair<int, string>(3, "小張")); // 第二種 通過pair的方式插入對象 mapStu.inset(make_pair(-1, "校長")); // 第三種 通過value_type的方式插入對象 mapStu.insert(map<int, string>::value_type(1, "小李")); // 第四種 通過數組的方式插入值 mapStu[3] = "小劉"; mapStu[5] = "小王";5. map刪除操作
clear();//刪除所有元素 erase(pos);//刪除pos迭代器所指的元素,返回下一個元素的迭代器。 erase(beg,end);//刪除區間[beg,end)的所有元素 ,返回下一個元素的迭代器。 erase(keyElem);//刪除容器中key為keyElem的對組。6. map查找操作
find(key);//查找鍵key是否存在,若存在,返回該鍵的元素的迭代器;/若不存在,返回map.end(); count(keyElem);//返回容器中key為keyElem的對組個數。對map來說,要么是0,要么是1。對multimap來說,值可能大于1。 lower_bound(keyElem);//返回第一個key>=keyElem元素的迭代器。 upper_bound(keyElem);//返回第一個key>keyElem元素的迭代器。 equal_range(keyElem);//返回容器中key與keyElem相等的上下限的兩個迭代器。9. STL容器使用時機
總結
以上是生活随笔為你收集整理的C/C++学习之路: STL的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C/C++学习之路: 模板和异常
- 下一篇: c语言实现c++的继承和多态