視頻:黑馬程序員
創(chuàng)新互聯(lián)是一家專注網(wǎng)站建設、網(wǎng)絡營銷策劃、小程序開發(fā)、電子商務建設、網(wǎng)絡推廣、移動互聯(lián)開發(fā)、研究、服務為一體的技術型公司。公司成立十年以來,已經(jīng)為上1000家花箱各業(yè)的企業(yè)公司提供互聯(lián)網(wǎng)服務。現(xiàn)在,服務的上1000家客戶與我們一路同行,見證我們的成長;未來,我們一起分享成功的喜悅。文章目錄STL 大體分為六大組件,分別是:容器、算法、迭代器、仿函數(shù)、適配器(配接器)、空間配置器
容器:置物之所也
STL容器就是將運用最廣泛的一些數(shù)據(jù)結(jié)構實現(xiàn)出來
常用的數(shù)據(jù)結(jié)構:數(shù)組, 鏈表,樹, 棧, 隊列, 集合, 映射表 等
這些容器分為序列式容器和關聯(lián)式容器兩種:
?序列式容器:強調(diào)值的排序,序列式容器中的每個元素均有固定的位置。
關聯(lián)式容器:二叉樹結(jié)構,各元素之間沒有嚴格的物理上的順序關系。
簡單理解:
序列式容器 怎么放就怎么顯示
關聯(lián)式容器 放了之后,可能會排序之后再顯示
算法:問題之解法也
有限的步驟,解決邏輯或數(shù)學上的問題,這一門學科我們叫做算法(Algorithms)
算法分為:質(zhì)變算法和非質(zhì)變算法。
質(zhì)變算法:是指運算過程中會更改區(qū)間內(nèi)的元素的內(nèi)容。例如拷貝,替換,刪除等等
非質(zhì)變算法:是指運算過程中不會更改區(qū)間內(nèi)的元素內(nèi)容,例如查找、計數(shù)、遍歷、尋找極值等等
迭代器:容器和算法之間粘合劑
提供一種方法,使之能夠依序?qū)ぴL某個容器所含的各個元素,而又無需暴露該容器的內(nèi)部表示方式。
每個容器都有自己專屬的迭代器
迭代器使用非常類似于指針,初學階段我們可以先理解迭代器為指針
迭代器種類:
種類 | 功能 | 支持運算 |
---|---|---|
輸入迭代器 | 對數(shù)據(jù)的只讀訪問 | 只讀,支持++、==、!= |
輸出迭代器 | 對數(shù)據(jù)的只寫訪問 | 只寫,支持++ |
前向迭代器 | 讀寫操作,并能向前推進迭代器 | 讀寫,支持++、==、!= |
雙向迭代器 | 讀寫操作,并能向前和向后操作 | 讀寫,支持++、–, |
隨機訪問迭代器 | 讀寫操作,可以以跳躍的方式訪問任意數(shù)據(jù),功能最強的迭代器 | 讀寫,支持++、–、[n]、-n、<、<=、>、>= |
常用的容器中迭代器種類為雙向迭代器,和隨機訪問迭代器
容器算法迭代器初識了解STL中容器、算法、迭代器概念之后,我們利用代碼感受STL的魅力
STL中最常用的容器為Vector,可以理解為數(shù)組,下面我們將學習如何向這個容器中插入數(shù)據(jù)、并遍歷這個容器
vector 存放內(nèi)置數(shù)據(jù)類型容器:vector
算法:for_each
迭代器:vector
對于
vector
不理解,可以去復習類模板,一個應用案例供理解
示例:
#include#include
using namespace std;
void MyPrint(int val)
{cout<< val<< endl;
}
void test01() {//創(chuàng)建vector容器對象,并且通過模板參數(shù)指定容器中存放的數(shù)據(jù)的類型
vectorv;
//向容器中放數(shù)據(jù)
v.push_back(10);
v.push_back(20);
v.push_back(30);
v.push_back(40);
//每一個容器都有自己的迭代器,迭代器是用來遍歷容器中的元素
//v.begin()返回迭代器,這個迭代器指向容器中第一個數(shù)據(jù)
//v.end()返回迭代器,這個迭代器指向容器元素的最后一個元素的下一個位置
//vector::iterator 拿到vector這種容器的迭代器類型
vector::iterator pBegin = v.begin();
vector::iterator pEnd = v.end();
//第一種遍歷方式:
while (pBegin != pEnd) {cout<< *pBegin<< endl;
pBegin++;
}
//第二種遍歷方式: 可以直接用 auto 關鍵字聲明 it
for (vector::iterator it = v.begin(); it != v.end(); it++) {cout<< *it<< endl;
}
cout<< endl;
//第三種遍歷方式:
//使用STL提供標準遍歷算法 頭文件 algorithm
for_each(v.begin(), v.end(), MyPrint);
}
int main() {test01();
system("pause");
return 0;
}
Vector存放自定義數(shù)據(jù)類型學習目標:vector中存放自定義數(shù)據(jù)類型,并打印輸出
示例:
#include#include#includeusing namespace std;
//自定義數(shù)據(jù)類型
class Person {public:
Person(string name, int age) {mName = name;
mAge = age;
}
public:
string mName;
int mAge;
};
//存放對象
void test01() {vectorv;
//創(chuàng)建數(shù)據(jù)
Person p1("aaa", 10);
Person p2("bbb", 20);
Person p3("ccc", 30);
Person p4("ddd", 40);
Person p5("eee", 50);
v.push_back(p1);
v.push_back(p2);
v.push_back(p3);
v.push_back(p4);
v.push_back(p5);
for (vector::iterator it = v.begin(); it != v.end(); it++) {cout<< "Name:"<< (*it).mName<< " Age:"<< (*it).mAge<< endl;
}
}
//放對象指針
void test02() {vectorv;
//創(chuàng)建數(shù)據(jù)
Person p1("aaa", 10);
Person p2("bbb", 20);
Person p3("ccc", 30);
Person p4("ddd", 40);
Person p5("eee", 50);
v.push_back(&p1);
v.push_back(&p2);
v.push_back(&p3);
v.push_back(&p4);
v.push_back(&p5);
// * 解引用,解出尖括號內(nèi)的類型,即Person*(Person的指針)
for (vector::iterator it = v.begin(); it != v.end(); it++) {Person * p = (*it);
cout<< "Name:"<< p->mName<< " Age:"<< (*it)->mAge<< endl;
}
}
int main() {test01();
test02();
system("pause");
return 0;
}
Vector容器嵌套容器學習目標:容器中嵌套容器,我們將所有數(shù)據(jù)進行遍歷輸出
示例:
#include#includeusing namespace std;
//容器嵌套容器
void test01() {vector< vector>v;
vectorv1;
vectorv2;
vectorv3;
vectorv4;
for (int i = 0; i< 4; i++) {v1.push_back(i + 1);
v2.push_back(i + 2);
v3.push_back(i + 3);
v4.push_back(i + 4);
}
//將容器元素插入到vector v中
v.push_back(v1);
v.push_back(v2);
v.push_back(v3);
v.push_back(v4);
// for (auto & it : v)
for (vector>::iterator it = v.begin(); it != v.end(); it++) {// for (int & vit : it)
for (vector::iterator vit = (*it).begin(); vit != (*it).end(); vit++) { cout<< *vit<< " ";
}
cout<< endl;
}
}
int main() {test01();
system("pause");
return 0;
}
STL- 常用容器
string 容器
string 基本概念本質(zhì):
string和char * 區(qū)別:
特點:
string 類內(nèi)部封裝了很多成員方法
例如:查找find,拷貝copy,刪除delete 替換replace,插入insert
string管理char*所分配的內(nèi)存,不用擔心復制越界和取值越界等,由類內(nèi)部進行負責
string構造函數(shù)構造函數(shù)原型:
string();
//創(chuàng)建一個空的字符串 例如: string str;string(const char* s);
//使用字符串s初始化string(const string& str);
//使用一個string對象初始化另一個string對象string(int n, char c);
//使用n個字符c初始化示例:
#include//string構造
void test01()
{string s1; //創(chuàng)建空字符串,調(diào)用無參構造函數(shù)
cout<< "str1 = "<< s1<< endl;
const char* str = "hello world";
string s2(str); //把c_string轉(zhuǎn)換成了string
cout<< "str2 = "<< s2<< endl;
string s3(s2); //調(diào)用拷貝構造函數(shù)
cout<< "str3 = "<< s3<< endl;
string s4(10, 'a');
cout<< "str3 = "<< s3<< endl;
}
int main() {test01();
system("pause");
return 0;
}
總結(jié):string的多種構造方式?jīng)]有可比性,靈活使用即可
Why copy constructor argument should be const in C++?
string賦值操作功能描述:
賦值的函數(shù)原型:
string& operator=(const char* s);
//char*類型字符串 賦值給當前的字符串string& operator=(const string &s);
//把字符串s賦給當前的字符串string& operator=(char c);
//字符賦值給當前的字符串string& assign(const char *s);
//把字符串s賦給當前的字符串string& assign(const char *s, int n);
//把字符串s的前n個字符賦給當前的字符串string& assign(const string &s);
//把字符串s賦給當前字符串string& assign(int n, char c);
//用n個字符c賦給當前字符串示例:
//賦值
void test01()
{string str1;
str1 = "hello world";
cout<< "str1 = "<< str1<< endl;
string str2;
str2 = str1;
cout<< "str2 = "<< str2<< endl;
string str3;
str3 = 'a';
cout<< "str3 = "<< str3<< endl;
string str4;
str4.assign("hello c++");
cout<< "str4 = "<< str4<< endl;
string str5;
str5.assign("hello c++",5);
cout<< "str5 = "<< str5<< endl;
string str6;
str6.assign(str5);
cout<< "str6 = "<< str6<< endl;
string str7;
str7.assign(5, 'x');
cout<< "str7 = "<< str7<< endl;
}
int main() {test01();
system("pause");
return 0;
}
總結(jié):
? string的賦值方式很多,operator=
這種方式是比較實用的
你是否還在尋找穩(wěn)定的海外服務器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調(diào)度確保服務器高可用性,企業(yè)級服務器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧