C/C++学习之路: STL
生活随笔
收集整理的這篇文章主要介紹了
C/C++学习之路: STL
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
C/C++學(xué)習(xí)之路: STL
目錄
1. STL概述
1. STL六大組件簡(jiǎn)介
2. STL優(yōu)點(diǎn)
2. STL三大組件
1. 容器
2. 算法
3. 迭代器
| 輸入迭代器 | 提供對(duì)數(shù)據(jù)的只讀訪問 |
| 輸出迭代器 | 提供對(duì)數(shù)據(jù)的只寫訪問 |
| 前向迭代器 | 提供讀寫操作,并能向前推進(jìn)迭代器 |
| 雙向迭代器 | 提供讀寫操作,并能向前和向后操作 |
| 隨機(jī)訪問迭代器 | 提供讀寫操作,并能在數(shù)據(jù)中隨機(jī)移動(dòng) |
3. 常用容器
1. string容器
1. string容器基本概念
2. string容器常用操作
1. string 構(gòu)造函數(shù)
string s1(); // si = "" string s2("Hello"); // s2 = "Hello" string s3(4, 'K'); // s3 = "KKKK" string s4("12345", 1, 3); //s4 = "234",即 "12345" 的從下標(biāo) 1 開始,長(zhǎng)度為 3 的子串2. string基本賦值操作
3. 求字符串的長(zhǎng)度
4. string對(duì)象中字符串的連接
除了可以使用+和+=運(yùn)算符對(duì) string 對(duì)象執(zhí)行字符串的連接操作外,string 類還有 append 成員函數(shù),可以用來向字符串后面添加內(nèi)容。append 成員函數(shù)返回對(duì)象自身的引用。例如:
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字符串轉(zhuǎn)換
//string 轉(zhuǎn) char* string str = "itcast"; const char* cstr = str.c_str(); //char* 轉(zhuǎn) string char* s = "itcast"; string sstr(s);10. 交換兩個(gè)string對(duì)象的內(nèi)容
11. 將 string 對(duì)象作為流處理
使用流對(duì)象 istringstream 和 ostringstream,可以將 string 對(duì)象當(dāng)作一個(gè)流進(jìn)行輸入輸出。使用這兩個(gè)類需要包含頭文件 sstream。
示例程序如下:
12. 用 STL 算法操作 string 對(duì)象
2. vector
1. vector迭代器
2. vector數(shù)據(jù)結(jié)構(gòu)
3. vector常用api操作
1. vector構(gòu)造函數(shù)
vector<T> v; //采用模板實(shí)現(xiàn)類實(shí)現(xiàn),默認(rèn)構(gòu)造函數(shù) vector(v.begin(), v.end());//將v[begin(), end())區(qū)間中的元素拷貝給本身。 vector(n, elem);//構(gòu)造函數(shù)將n個(gè)elem拷貝給本身。 vector(const vector &vec);//拷貝構(gòu)造函數(shù)。//例子 使用第二個(gè)構(gòu)造函數(shù) int arr[] = {2,3,4,1,9}; vector<int> v1(arr, arr + sizeof(arr) / sizeof(int)); // 使用第三個(gè)構(gòu)造函數(shù) vector<int> v2(10,6);2. vector常用賦值操作
assign(beg, end);//將[beg, end)區(qū)間中的數(shù)據(jù)拷貝賦值給本身。 assign(n, elem);//將n個(gè)elem拷貝賦值給本身。 vector&operator=(const vector &vec);//重載等號(hào)操作符 swap(vec);// 將vec與本身的元素互換。vector<int> v;v.assign(10,6);v.swap(v2);3. vector大小操作
size();//返回容器中元素的個(gè)數(shù) empty();//判斷容器是否為空 resize(int num);//重新指定容器的長(zhǎng)度為num,若容器變長(zhǎng),則以默認(rèn)值填充新位置。如果容器變短,則末尾超出容器長(zhǎng)度的元素被刪除。 resize(int num, elem);//重新指定容器的長(zhǎng)度為num,若容器變長(zhǎng),則以elem值填充新位置。如果容器變短,則末尾超出容器長(zhǎng)>度的元素被刪除。 capacity();//容器的容量 reserve(int len);//容器預(yù)留len個(gè)元素長(zhǎng)度,預(yù)留位置不初始化,元素不可訪問。4. vector數(shù)據(jù)存取操作
at(int idx); //返回索引idx所指的數(shù)據(jù),如果idx越界,拋出out_of_range異常。 operator[];//返回索引idx所指的數(shù)據(jù),越界時(shí),運(yùn)行直接報(bào)錯(cuò) front();//返回容器中第一個(gè)數(shù)據(jù)元素 back();//返回容器中最后一個(gè)數(shù)據(jù)元素5. vector插入和刪除操作
insert(const_iterator pos, int count,ele);//迭代器指向位置pos插入count個(gè)元素ele. push_back(ele); //尾部插入元素ele pop_back();//刪除最后一個(gè)元素 erase(const_iterator start, const_iterator end);//刪除迭代器從start到end之間的元素 erase(const_iterator pos);//刪除迭代器指向的元素 clear();//刪除容器中所有元素4. vector案例
1. 使用swap,收縮內(nèi)存空間
#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;//此時(shí) 通過resize改變?nèi)萜鞔笮?/span>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 預(yù)留空間
#define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<vector> usingnamespace std;int main(){vector<int> v;//預(yù)先開辟空間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容器實(shí)現(xiàn)原理
2. deque常用api操作
1. deque構(gòu)造函數(shù)
deque<T> deqT;//默認(rèn)構(gòu)造形式 deque(beg, end);//構(gòu)造函數(shù)將[beg, end)區(qū)間中的元素拷貝給本身。 deque(n, elem);//構(gòu)造函數(shù)將n個(gè)elem拷貝給本身。 deque(const deque &deq);//拷貝構(gòu)造函數(shù)。2. deque賦值操作
assign(beg, end);//將[beg, end)區(qū)間中的數(shù)據(jù)拷貝賦值給本身。 assign(n, elem);//將n個(gè)elem拷貝賦值給本身。 deque&operator=(const deque &deq); //重載等號(hào)操作符 swap(deq);// 將deq與本身的元素互換3. deque大小操作
deque.size();//返回容器中元素的個(gè)數(shù) deque.empty();//判斷容器是否為空 deque.resize(num);//重新指定容器的長(zhǎng)度為num,若容器變長(zhǎng),則以默認(rèn)值填充新位置。如果容器變短,則末尾超出容器長(zhǎng)度的元素被刪除。 deque.resize(num, elem); //重新指定容器的長(zhǎng)度為num,若容器變長(zhǎng),則以elem值填充新位置,如果容器變短,則末尾超出容器長(zhǎng)度的元素被刪除。4. deque雙端插入和刪除操作
push_back(elem);//在容器尾部添加一個(gè)數(shù)據(jù) push_front(elem);//在容器頭部插入一個(gè)數(shù)據(jù) pop_back();//刪除容器最后一個(gè)數(shù)據(jù) pop_front();//刪除容器第一個(gè)數(shù)據(jù)5. deque雙端插入和刪除操作
at(idx);//返回索引idx所指的數(shù)據(jù),如果idx越界,拋出out_of_range。 operator[];//返回索引idx所指的數(shù)據(jù),如果idx越界,不拋出異常,直接出錯(cuò)。 front();//返回第一個(gè)數(shù)據(jù)。 back();//返回最后一個(gè)數(shù)據(jù)6. deque插入操作
insert(pos,elem);//在pos位置插入一個(gè)elem元素的拷貝,返回新數(shù)據(jù)的位置。 insert(pos,n,elem);//在pos位置插入n個(gè)elem數(shù)據(jù),無返回值。 insert(pos,beg,end);//在pos位置插入[beg,end)區(qū)間的數(shù)據(jù),無返回值。7. deque刪除操作
clear();//移除容器的所有數(shù)據(jù) erase(beg,end);//刪除[beg,end)區(qū)間的數(shù)據(jù),返回下一個(gè)數(shù)據(jù)的位置。 erase(pos);//刪除pos位置的數(shù)據(jù),返回下一個(gè)數(shù)據(jù)的位置。4. stack容器
1. stack容器基本概念
2. stack沒有迭代器
3. stack常用API
1. stack構(gòu)造函數(shù)
stack<T> stkT;//stack采用模板類實(shí)現(xiàn), stack對(duì)象的默認(rèn)構(gòu)造形式: stack(const stack &stk);//拷貝構(gòu)造函數(shù)2. stack賦值操作
stack&operator=(const stack &stk);//重載等號(hào)操作符3. stack數(shù)據(jù)存取操作
push(elem);//向棧頂添加元素 pop();//從棧頂移除第一個(gè)元素 top();//返回棧頂元素4. stack大小操作
empty();//判斷堆棧是否為空 size();//返回堆棧的大小5. queue
1. queue容器基本概念
2. queue沒有迭代器
Queue所有元素的進(jìn)出都必須符合”先進(jìn)先出”的條件,只有queue的頂端元素,才有機(jī)會(huì)被外界取用。Queue不提供遍歷功能,也不提供迭代器。
3. queue常用API
1. queue構(gòu)造函數(shù)
queue<T> queT;//queue采用模板類實(shí)現(xiàn),queue對(duì)象的默認(rèn)構(gòu)造形式: queue(const queue &que);//拷貝構(gòu)造函數(shù)2. queue存取、插入和刪除操作
push(elem);//往隊(duì)尾添加元素 pop();//從隊(duì)頭移除第一個(gè)元素 back();//返回最后一個(gè)元素 front();//返回第一個(gè)元素3. queue賦值操作
queue&operator=(const queue &que);//重載等號(hào)操作符4. queue大小操作
empty();//判斷隊(duì)列是否為空 size();//返回隊(duì)列的大小6. list容器
1. list容器基本概念
2. list容器的迭代器
List有一個(gè)重要的性質(zhì),插入操作和刪除操作都不會(huì)造成原有l(wèi)ist迭代器的失效。這在vector是不成立的,因?yàn)関ector的插入操作可能造成記憶體重新配置,導(dǎo)致原有的迭代器全部失效,甚至List元素的刪除,也只有被刪除的那個(gè)元素的迭代器失效,其他迭代器不受任何影響。
3. list容器的數(shù)據(jù)結(jié)構(gòu)
4. list常用api
1. list構(gòu)造函數(shù)
list<T> lstT;//list采用采用模板類實(shí)現(xiàn),對(duì)象的默認(rèn)構(gòu)造形式: list(beg,end);//構(gòu)造函數(shù)將[beg, end)區(qū)間中的元素拷貝給本身。 list(n,elem);//構(gòu)造函數(shù)將n個(gè)elem拷貝給本身。 list(const list &lst);//拷貝構(gòu)造函數(shù)。2. list數(shù)據(jù)元素插入和刪除操作
push_back(elem);//在容器尾部加入一個(gè)元素 pop_back();//刪除容器中最后一個(gè)元素 push_front(elem);//在容器開頭插入一個(gè)元素 pop_front();//從容器開頭移除第一個(gè)元素 insert(pos,elem);//在pos位置插e(cuò)lem元素的拷貝,返回新數(shù)據(jù)的位置。 insert(pos,n,elem);//在pos位置插入n個(gè)elem數(shù)據(jù),無返回值。 insert(pos,beg,end);//在pos位置插入[beg,end)區(qū)間的數(shù)據(jù),無返回值。 clear();//移除容器的所有數(shù)據(jù) erase(beg,end);//刪除[beg,end)區(qū)間的數(shù)據(jù),返回下一個(gè)數(shù)據(jù)的位置。 erase(pos);//刪除pos位置的數(shù)據(jù),返回下一個(gè)數(shù)據(jù)的位置。 remove(elem);//刪除容器中所有與elem值匹配的元素。3. list大小操作
size();//返回容器中元素的個(gè)數(shù) empty();//判斷容器是否為空 resize(num);//重新指定容器的長(zhǎng)度為num,若容器變長(zhǎng),則以默認(rèn)值填充新位置。如果容器變短,則末尾超出容器長(zhǎng)度的元素被刪除。 resize(num, elem);//重新指定容器的長(zhǎng)度為num,若容器變長(zhǎng),則以elem值填充新位置。如果容器變短,則末尾超出容器長(zhǎng)度的元素被刪除。4. list賦值操作
assign(beg, end);//將[beg, end)區(qū)間中的數(shù)據(jù)拷貝賦值給本身。 assign(n, elem);//將n個(gè)elem拷貝賦值給本身。 list&operator=(const list &lst);//重載等號(hào)操作符 swap(lst);//將lst與本身的元素互換。5. list數(shù)據(jù)的存取
front();//返回第一個(gè)元素。 back();//返回最后一個(gè)元素。6. list反轉(zhuǎn)排序
reverse();//反轉(zhuǎn)鏈表,比如lst包含1,3,5元素,運(yùn)行此方法后,lst就包含5,3,1元素。 sort(); //list排序7. set/multiset 容器
1. set/multiset容器基本概念
1. set容器基本概念
2. multiset容器基本概念
2. set常用API
1. set構(gòu)造函數(shù)
set<T> st;//set默認(rèn)構(gòu)造函數(shù): mulitset<T> mst; //multiset默認(rèn)構(gòu)造函數(shù): set(const set &st);//拷貝構(gòu)造函數(shù)2. set賦值操作
set&operator=(const set &st);//重載等號(hào)操作符 swap(st);//交換兩個(gè)集合容器3. set大小操作
size();//返回容器中元素的數(shù)目 empty();//判斷容器是否為空4. set插入和刪除操作
insert(elem);//在容器中插入元素。 clear();//清除所有元素 erase(pos);//刪除pos迭代器所指的元素,返回下一個(gè)元素的迭代器。 erase(beg, end);//刪除區(qū)間[beg,end)的所有元素 ,返回下一個(gè)元素的迭代器。 erase(elem);//刪除容器中值為elem的元素。5. set查找操作
find(key);//查找鍵key是否存在,若存在,返回該鍵的元素的迭代器;若不存在,返回set.end(); count(key);//查找鍵key的元素個(gè)數(shù) lower_bound(keyElem);//返回第一個(gè)key>=keyElem元素的迭代器。 upper_bound(keyElem);//返回第一個(gè)key>keyElem元素的迭代器。 equal_range(keyElem);//返回容器中key與keyElem相等的上下限的兩個(gè)迭代器。6. set的返回值和指定set排序規(guī)則
//插入操作返回值 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));//我們發(fā)現(xiàn)set容器的第二個(gè)模板參數(shù)可以設(shè)置排序規(guī)則,默認(rèn)規(guī)則是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容器中存放對(duì)象 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構(gòu)造函數(shù)
map<T1, T2> mapTT;//map默認(rèn)構(gòu)造函數(shù): map(const map &mp);//拷貝構(gòu)造函數(shù)2. map賦值操作
map&operator=(const map &mp);//重載等號(hào)操作符 swap(mp);//交換兩個(gè)集合容器3. map大小操作
size();//返回容器中元素的數(shù)目 empty();//判斷容器是否為空4. map插入數(shù)據(jù)元素操作
map.insert(...); //往容器插入元素,返回pair<iterator,bool> map<int, string> mapStu; // 第一種 通過pair的方式插入對(duì)象 mapStu.insert(pair<int, string>(3, "小張")); // 第二種 通過pair的方式插入對(duì)象 mapStu.inset(make_pair(-1, "校長(zhǎng)")); // 第三種 通過value_type的方式插入對(duì)象 mapStu.insert(map<int, string>::value_type(1, "小李")); // 第四種 通過數(shù)組的方式插入值 mapStu[3] = "小劉"; mapStu[5] = "小王";5. map刪除操作
clear();//刪除所有元素 erase(pos);//刪除pos迭代器所指的元素,返回下一個(gè)元素的迭代器。 erase(beg,end);//刪除區(qū)間[beg,end)的所有元素 ,返回下一個(gè)元素的迭代器。 erase(keyElem);//刪除容器中key為keyElem的對(duì)組。6. map查找操作
find(key);//查找鍵key是否存在,若存在,返回該鍵的元素的迭代器;/若不存在,返回map.end(); count(keyElem);//返回容器中key為keyElem的對(duì)組個(gè)數(shù)。對(duì)map來說,要么是0,要么是1。對(duì)multimap來說,值可能大于1。 lower_bound(keyElem);//返回第一個(gè)key>=keyElem元素的迭代器。 upper_bound(keyElem);//返回第一個(gè)key>keyElem元素的迭代器。 equal_range(keyElem);//返回容器中key與keyElem相等的上下限的兩個(gè)迭代器。9. STL容器使用時(shí)機(jī)
總結(jié)
以上是生活随笔為你收集整理的C/C++学习之路: STL的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C/C++学习之路: 模板和异常
- 下一篇: Ubuntu下搭建Janus Serve