一、概述
STL(标準模闆庫),是目前C++内置支援的library,底層利用了C++類模闆和函數模闆的機制,廣義上由三大部分組成:容器、算法和疊代器。
STL大體分為六大元件,分别是容器、算法、疊代器、仿函數、擴充卡(配接器)、空間配置器。
- 容器:各種資料結構,如
、vector
list
deque
set
等,用來存放資料。map
- 算法:各種常用的算法,如
sort
find
copy
等。for_each
- 疊代器:扮演了容器與算法之間的膠合劑。
- 仿函數:行為類似函數,可作為算法的某種政策。
- 擴充卡:一種用來修飾容器或者仿函數或疊代器接口的東西。
- 空間配置器:負責空間的配置與管理。
容器是STL中很重要的一種資料結構。常見的容器包括:
vector容器,deque雙端數組
stack棧模型,queue隊列模型
list連結清單模型
priotriy_queue優先級隊列
vector | deque | list | set | mutliset | map | multimap | |
---|---|---|---|---|---|---|---|
記憶體結構 | 單端數組 | 雙端數組 | 雙向連結清單 | 二叉樹 | |||
随機存取 | 是 | 否 | 對key而言是 | ||||
查找速度 | 慢 | 非常慢 | 快 | 對key而言快 | |||
插入删除 | 尾端 | 頭尾兩端 | 任何位置 | - | $1 |
線上手冊:http://www.martinbroadhurst.com/stl/
man:Ubuntu16下sudo apt-get install libstdc++-5-doc, man std::vector
二、string
string() string(const char *s) string(const string &str) string(int n, char c)
int find(const string &str, int pos = 0) const;
//從
pos
開始查找
str
第一次出現的位置
int find(const char *s, int pos = 0) const;
pos
s
int find(const char *s, int pos, int n) const;
pos
位置查找
s
的前
n
個字元第一次出現的位置
int find(const char c, int pos = 0) const;
//查找字元
c
第一次出現位置
int rfind(const string &str, int pos = npos) const;
pos
str
最後一次出現的位置
int rfind(const char *s, int pos = npos) const;
pos
str
int rfind(const char *s, int pos, int n) const;
pos
s
n
個字元最後一次出現的位置
int rfind(const char c, int pos = 0) const;
c
string &replace(int pos, int n, const string &str);
//将從
pos
開始的
n
個字元替換為字元串
str
string &replace(int pos, int n, const chat *s);
pos
n
s
string &insert(int pos, const char *s);
//插入字元串
string &insert(int pos, const string &str);
string &insert(int pos, int n, char c);
//在指定位置插入n個字元c
string &erase(int pos, int n = npos);
//删除從pos開始的n個字元
string substr(int pos = 0, int n = npose) const;
//傳回由
pos
n
個字元組成的字元串
将數值轉換為字元串:
string to_string (int val);
string to_string (long val);
string to_string (long long val);
string to_string (unsigned val);
string to_string (unsigned long val);
string to_string (unsigned long long val);
string to_string (float val);
string to_string (double val);
string to_string (long double val);
三、模闆
#include <iostream>
#include <string>
#include <unistd.h>
using namespace std;
template<class NameType=string, class AgeType=short>
class Person {
public:
Person(NameType name, AgeType age) {
m_name = name;
m_age = age;
}
void showInfo() {
cout << m_name << " is " << m_age << (m_age == 1 ? " year" : " years") << " old. " << endl;
}
NameType m_name;
AgeType m_age;
};
class Wang: public Person<string, short> {
};
void printPerson1(Person<string, short> &p)
{
p.showInfo();
}
template <class NameType, class AgeType>
void printPerson2(Person<NameType, AgeType> &p){
p.showInfo();
cout << "\t NameType:" << typeid(NameType).name() << endl
<< "\t AgetType:" << typeid(AgeType).name() << endl;
}
template <typename T>
void printPerson3(T &p){
p.showInfo();
cout << "\t T:" << typeid(T).name() << endl;
}
void test1(){
Person<string, short> p1("tony", 100);
printPerson1(p1);
Person<string, short> p2("AAA", 99);
printPerson2(p2);
Person<string, short> p3("BBB", 98);
printPerson3(p3);
Wang w1;
cout << "w.m_name is " << typeid(w1.m_name).name() << endl;
cout << "w.m_age is " << typeid(w1.m_age).name() << endl;
}
int main(){
test1();
pause();
return 0;
}
參考:
1. C++提高程式設計(一) 匠心之作 從0到1入門學程式設計 黑馬程式員
2. C++進階-STL容器,你看我就夠了 - 簡書
3. String用法詳解