STL组件
六大组件:容器、算法、迭代器、仿函数、适配器(配接器)、空间配置器
容器
各种数据结构,如vector、list、deque、set、map等,用来存放数据,从实现角度来看STL容器是一种class template
算法
各种常用的算法,如sort、find、copy、for_each,从实现的角度来看, STL算法是一种function tempalte
迭代器
扮演了容器与算法之间的胶合剂,共有五种类型,从实现角度来看,迭代器是一种将operator* , operator-> ,operator++,operator--等指针相关操作予以重载的class template,所有STL容器都附带有自己专属的迭代器,只有容器的设计者才知道如何遍历自己的元素
迭代器
#include<iostream>
using namespace std;
#include <vector> // vector容器的头文件
#include <algorithm> // 系统标准算法头文件
#include <string>
void myPrint(int val);
// 内置属性类型
int main()
{
vector<int>v; // 声明一个vector的容器
// 想容器中添加数据
v.push_back(10);
v.push_back(20);
v.push_back(30);
v.push_back(40);
// 通过迭代器可以 遍历容器
// 每个容器都有自己专属的迭代器
vector<int>::iterator itBegin = v.begin(); // 起始迭代器
vector<int>::iterator itEnd = v.end(); // 结束迭代器
// 第一种遍历方式
while (itBegin != itEnd)
{
cout << *itBegin << endl;
itBegin++;
}
// 第二种遍历方式
for (vector<int>::iterator it = v.begin(); it != v.end();it++)
{
cout << *it << endl;
}
// 第三种遍历方式 利用系统提供算法
for_each(v.begin(), v.end(), myPrint);
// c++11 增强for
for(int i: v)
{
cout << i << endl;
}
}
void myPrint(int val)
{
cout << val << endl;
}
string
// 构造函数
string();//创建一个空的字符串 例如: string str;
string(const string& str);//使用一个string对象初始化另一个string对象
string(const char* s);//使用字符串s初始化
string(int n, char c);//使用n个字符c初始化
// string基本赋值操作
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赋给当前字符串
string& assign(const string &s, int start, int n);//将s从start开始n个字符赋值给字符串
// string存取字符操作
char& operator[](int n);//通过[]方式取字符
char& at(int n);//通过at方法获取字符
// string拼接操作
string& operator+=(const string& str);//重载+=操作符
string& operator+=(const char* str);//重载+=操作符
string& operator+=(const char c);//重载+=操作符
string& append(const char *s);//把字符串s连接到当前字符串结尾
string& append(const char *s, int n);//把字符串s的前n个字符连接到当前字符串结尾
string& append(const string &s);//同operator+=()
string& append(const string &s, int pos, int n);//把字符串s中从pos开始的n个字符连接到当前字符串结尾
string& append(int n, char c);//在当前字符串结尾添加n个字符c
// string查找和替换
int find(const string& str, int pos = 0) const; //查找str第一次出现位置,从pos开始查找
int find(const char* s, int pos = 0) const; //查找s第一次出现位置,从pos开始查找
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;//查找str最后一次位置,从pos开始查找
int rfind(const char* s, int pos = npos) const;//查找s最后一次出现位置,从pos开始查找
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 char* s); //替换从pos开始的n个字符为字符串s
// string比较操作
/*
compare函数在>时返回 1,<时返回 -1,==时返回 0。
比较区分大小写,比较时参考字典顺序,排越前面的越小。
大写的A比小写的a小
*/
int compare(const string &s) const;//与字符串s比较
int compare(const char *s) const;//与字符串s比较
// string子串
string substr(int pos = 0, int n = npos) const;//返回由pos开始的n个字符组成的字符串
// string插入和删除操作
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 s1 = "12345";
string s2 = string("123");
string s3(5, 'c');
cout << s1 << endl; // 12345
cout << s2 << endl; // 123
cout << s3 << endl; // ccccc
赋值
string s4 = s3;
string s5, s6;
s5.assign("qweasdzxc", 4);
s6.assign("asdzxc123sdf", 2, 4);
cout << s4 << endl; // ccccc
cout << s5 << endl; // qwea
cout << s6 << endl; // dzxc
cout << s7 << endl; // 23
存取
string s1 = "12345qweasdzxc";
for(int i = 0; i < s1.size(); i++)
{
cout << s1[i] << endl; // 数组下标 越界程序结束
cout << s1.at(i) << endl; // at方法 越界抛出异常
}
拼接
string s1 = "qweasd";
string s2 = "123456";
s2 += s1;
string s3 = s2.append("zxczxc"); // 拼接
string s4 = s2.append("123456", 0, 3);
string s5 = s2.append(5, 'a');
cout << s2 << endl; // 123456qweasdzxczxc123aaaaa
cout << s3 << endl; // 123456qweasdzxczxc
cout << s4 << endl; // 123456qweasdzxczxc123
cout << s5 << endl; // 123456qweasdzxczxc123aaaaa
查找
string s1 = "qwEAsdertxcvzxcEA";
int pos1 = s1.find("EA");
int pos2 = s1.find("ee");
int pos3 = s1.rfind("EA"); // 从右向左找
cout << pos1 << endl; // 2
cout << pos2 << endl; // -1
cout << pos3 << endl; // 15
string s2 = "qweaAAsdzxc123";
int pos4 = s2.find("AA", 6); // 第二个参数为起始位置
cout << pos4 << endl; // -1
替换
string s1 = "qweasdzxcertdfgcvb";
s1.replace(0, 3, "1");
cout << s1 << endl; // 1asdzxcertdfgcvb
s1.replace(0, 3, "111111111");
cout << s1 << endl; // 111111111dzxcertdfgcvb
比较
string s1 = "asd";
string s2 = "asd";
string s3 = "qwe";
string s4 = "ASD";
if(s1.compare(s2) == 0)
cout << "eq" << endl;
if(s1.compare(s3) < 0)
cout << "lt" << endl;
if(s1.compare(s4) > 0)
cout << "gt" << endl;
子串
string s1 = "qweasdzxc123";
string s2 = s1.substr(3, 6);
string s3 = "123456789@qq.com";
string s4 = s3.substr(0, s3.find("@"));
cout << s2 << endl; // asdzxc
cout << s4 << endl; // 123456789
插入和删除
string s1 = "hello";
s1.insert(1, "111");
cout << s1 << endl; // h111ello
s1.erase(1, 3);
cout << s1 << endl; // hello
string和c-style字符串转换
// char * -> string
char s1 = "hello";
string s(s1);
// string -> char *
const char *s2 = s.c_str();
vector
// vector构造函数
vector<T> v; //采用模板实现类实现,默认构造函数
vector(v.begin(), v.end());//将v[begin(), end())区间中的元素拷贝给本身。
vector(n, elem);//构造函数将n个elem拷贝给本身。
vector(const vector &vec);//拷贝构造函数。
// vector常用赋值操作
assign(beg, end);//将[beg, end)区间中的数据拷贝赋值给本身。
assign(n, elem);//将n个elem拷贝赋值给本身。
vector& operator=(const vector &vec);//重载等号操作符
swap(vec);// 将vec与本身的元素互换。
// vector大小操作
size();//返回容器中元素的个数
empty();//判断容器是否为空
resize(int num);//重新指定容器的长度为num,若容器变长,则以默认值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。
resize(int num, elem);//重新指定容器的长度为num,若容器变长,则以elem值填充新位置。如果容器变短,则末尾超出容器长>度的元素被删除。
capacity();//容器的容量
reserve(int len);//容器预留len个元素长度,预留位置不初始化,元素不可访问。
// vector数据存取操作
at(int idx); //返回索引idx所指的数据,如果idx越界,抛出out_of_range异常。
operator[];//返回索引idx所指的数据,越界时,运行直接报错
front();//返回容器中第一个数据元素
back();//返回容器中最后一个数据元素
// 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();//删除容器中所有元素
构造
vector<int>v1;
vector<int>v2(10, 100);
printVector(v2);
vector<int>v3(v2.begin(), v2.end());
printVector(v3);
赋值
vector<int>v4;
//v4.assign(v3.begin(), v3.end());
v4 = v3;
int arr[] = { 2, 3, 4, 1, 9 };
vector<int> v5(arr, arr + sizeof(arr) / sizeof(int));
//swap交换
v4.swap(v5);
容量大小
vector<int>v1;
v1.push_back(10);
v1.push_back(40);
v1.push_back(20);
v1.push_back(30);
cout << "size = " << v1.size() << endl;
if (v1.empty())
cout << "v1为空" << endl;
else
cout << "v1不为空" << endl;
// 重新指定容器长度 resize
v1.resize(10,1000); // 第二个参数是默认填充的值,如果不写默认值为0
v1.resize(3);
存取
vector<int>v1;
v1.push_back(10);
v1.push_back(40);
v1.push_back(20);
v1.push_back(30);
cout << "v1的第一个元素: " << v1.front() << endl;
cout << "v1的最后一个元素: " << v1.back() << endl;
cout << v1.at(3) << endl; // 越界抛异常
cout << v1[3] << endl; // 越界出错
插入、删除
vector<int>v1;
v1.push_back(10);
v1.push_back(40);
v1.push_back(20);
v1.push_back(30);
v1.insert(v1.begin(), 2, 1000); // 参数1 是迭代器
printVector(v1); // 1000 1000 10 40 20
v1.pop_back(); // 尾删
printVector(v1);// 1000 1000 10 40
v1.erase(v1.begin() , v1.end()); // 删除
v1.clear(); // 清空
printVector(v1);
deque
// deque构造函数
deque<T> deqT;//默认构造形式
deque(beg, end);//构造函数将[beg, end)区间中的元素拷贝给本身。
deque(n, elem);//构造函数将n个elem拷贝给本身。
deque(const deque &deq);//拷贝构造函数。
// deque赋值操作
assign(beg, end);//将[beg, end)区间中的数据拷贝赋值给本身。
assign(n, elem);//将n个elem拷贝赋值给本身。
deque& operator=(const deque &deq); //重载等号操作符
swap(deq);// 将deq与本身的元素互换
// deque大小操作
deque.size();//返回容器中元素的个数
deque.empty();//判断容器是否为空
deque.resize(num);//重新指定容器的长度为num,若容器变长,则以默认值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。
deque.resize(num, elem); //重新指定容器的长度为num,若容器变长,则以elem值填充新位置,如果容器变短,则末尾超出容器长度的元素被删除。
// deque双端插入和删除操作
push_back(elem);//在容器尾部添加一个数据
push_front(elem);//在容器头部插入一个数据
pop_back();//删除容器最后一个数据
pop_front();//删除容器第一个数据
// deque数据存取
at(idx);//返回索引idx所指的数据,如果idx越界,抛出out_of_range。
operator[];//返回索引idx所指的数据,如果idx越界,不抛出异常,直接出错。
front();//返回第一个数据。
back();//返回最后一个数据
// deque插入操作
insert(pos,elem);//在pos位置插入一个elem元素的拷贝,返回新数据的位置。
insert(pos,n,elem);//在pos位置插入n个elem数据,无返回值。
insert(pos,beg,end);//在pos位置插入[beg,end)区间的数据,无返回值。
// deque删除操作
clear();//移除容器的所有数据
erase(beg,end);//删除[beg,end)区间的数据,返回下一个数据的位置。
erase(pos);//删除pos位置的数据,返回下一个数据的位置。
构造
deque<int> d1;
deque<int> d2(10, 5);
deque<int> d3(d2.begin(), d2.end());
printDeque(d1);
printDeque(d2);
printDeque(d3);
赋值
deque<int>d2(10, 10);
d.swap(d2);
printDeque(d);
if (d.empty())
cout << "d为空" << endl;
else
cout << "d不为空--size = " << d.size() << endl;
插入、删除
deque<int>d;
d.push_back(10);
d.push_back(20);
d.push_back(30);
d.push_back(40);
d.push_front(100);
d.push_front(200);
d.push_front(300);
d.push_front(400);
printDeque(d); // 400 300 200 100 10 20 30 40
d.pop_back(); //删除 40
d.pop_front(); // 删除 400
printDeque(d); // 300 200 100 10 20 30
cout << "第一个元素: " << d.front() << endl;
cout << "最后一个元素: " << d.back() << endl;
//插入
d.insert(++d.begin(), 10000);
printDeque(d); // 300 10000 200 100 10 20 30
//删除
d.erase(++d.begin(),--d.end()); //删除区间 10000 到 20的区间都删除掉
printDeque(d);