前言
对C++标准模板库(STL)的学习所整理的笔记
常用C++标准模板库(STL)
1. vector
vector:向量,也可理解为变长数组,即长度根据需要而自动改变的数组
使用条件:
#include <vector>
using namespace std;
vector定义:
vector<int> v; //一维变长数组 int型
vector<vector<int> > v; //二维变长数组 int型, >>之间加上空格
vector<int> v[100]; //v[0] ~ v[99]每个都是一个vector容器, 一维固定, 一维变长
vector容器内元素的访问:
//通过下标访问, index范围 0 ~ v.size()-1
v[index];
//通过迭代器访问, v.begin()获取v的首元素地址, v.end()获取v的尾元素的下一个元素的地址, 左闭右开思想; 不支持it < v.end()这种写法
for(vector<int>::iterator it = v.begin();it!=v.end();it++){
cout<<*it;
}
//在vector中,还支持v.begin()+3这种迭代器加上整数的写法
vector<int>::iterator it = v.begin();
for(int i = 0;i < v.size();i++){
cout<<*(it+i);
}
vector常用函数:
v.push_back(x); //将x添加到向量v的末尾
v.pop_back(); //删除向量v的尾元素
v.size(); //获取向量v中元素的个数
v.clear(); //清空向量v中的所有元素
v.insert(it, x); //在迭代器it处插入元素x
v.erase(it); //删除迭代器it处的元素(删除单个元素)
v.erase(first, last); //删除迭代器[first, last)内的元素(删除区间内的所有元素)
2. set
set:集合,是一个内部自动升序且不含重复元素的容器
使用条件:
#include <set>
using namespace std;
set定义:
set<int> st; //一维变长集合 int型
set<set<int> > st; //二维变长集合 int型, >>之间加上空格
set<int> st[100]; //st[0] ~ st[99]每个都是一个set容器, 一维固定, 一维变长
set容器内元素的访问:
//set只能通过迭代器访问, st.begin()获取st的首元素地址, st.end()获取st的尾元素的下一个元素的地址, 左闭右开思想; 不支持it < st.end()这种写法
for(set<int>::iterator it = st.begin();it!=st.end();it++){
cout<<*it;
}
set常用函数:
st.insert(x); //将x插入set容器中,并自动递增排序和去重
st.find(value); //在st容器中查找值value,并返回它的迭代器it
st.erase(it); //传入想删除元素的迭代器it, 可结合find函数使用:st.erase(st.find(value));(删除单个元素)
st.erase(value); //传入想要删除的元素值value(删除单个元素)
st.erase(first, last); //删除迭代器[first, last)内的元素(删除区间内的所有元素)
st.size(); //获取集合st中元素的个数
st.clear(); //清空集合st中的所有元素
3. string
字符串
使用条件:
#include <string>
using namespace std;
string定义:
string s; //字符串变量定义
string s = "abcd"; //字符串变量定义并初始化
string中内容的访问:
//通过下标访问
s[index];
//使用cin和cout读入和输出字符串
#include <iostream>
using namespace std;
string s;
cin>>s;
cout<<s;
//使用printf()输出字符串
#include <stdio.h>
printf("%s\n", s.c_str());
//通过迭代器访问, s.begin()获取s的首元素地址, s.end()获取s的尾元素的下一个元素的地址, 左闭右开思想; 不支持it < s.end()这种写法
for(string::iterator it = s.begin();it!=s.end();it++){
cout<<*it;
}
//在string中,还支持s.begin()+3这种迭代器加上整数的写法
string::iterator it = s.begin();
for(int i = 0;i < s.size();i++){
cout<<*(it+i);
}
string常用函数:
operator += //拼接
compare operator == != < <= > >= //比较大小,字典序
s.length(); s.size(); //string长度
s.insert(index, string); //在s[index]处插入string
s.insert(s.begin()+index, s2.begin(), s2.end()); //将字符串s2的[s2.begin(), s2.end())插入到s的迭代器s.begin()+index处
s.erase(it); //删除迭代器it处的元素(删除单个元素)
s.erase(first, last); //删除迭代器[first, last)内的元素(删除区间内的所有元素)
s.erase(index, length); //删除字符串s内以index为起始, 长度为length的字符
s.clear(); //清空字符串
s.substr(index, length); //返回s内以index为起始, 长度为length的子串
string::npos //函数find()失配时的返回值, 等于-1或者4294967295
s.find(str); //如果str是s的子串, 则返回第一次出现的位置, 否则返回string::npos
s.find(str, index); //从s的index开始查str, 返回值与上述相同
s.replace(index, length, str); //把字符串s的index起始, 长度为length的子串用str代替
s.replace(it1, it2, str); //把字符串s的迭代器[it1, it2)的子串用str代替
4. map
如果把一个int型的数组理解为index(int)到data(int)的映射,那么map就是任何基本类型(包括STL容器)到任何基本类型(包括STL容器)的映射,map会以键key从小到大的顺序自动排序
使用条件:
#include <map>
using namespace std;
map定义:
map<string, int> mp; //string到int的映射
map<set<int>, int> mp; //set容器到int的映射
map容器中内容的访问:
//通过key访问
map<char, int> mp;
mp['a']; //map通过key访问value, 且key唯一
//通过迭代器访问, mp.begin()获取s的首元素地址, mp.end()获取s的尾元素的下一个元素的地址, 左闭右开思想; 不支持it < mp.end()这种写法
for(map<char, int>::iterator it = mp.begin();it!=mp.end();it++){
cout<<"key: "<<it->first;
cout<<"value: "<<it->second;
}
map常用函数:
mp.find(key); //返回键为key的映射的迭代器
mp.erase(it); //删除迭代器it处的元素(删除单个元素)
mp.erase(key); //删除键key处的元素(删除单个元素)
mp.erase(first, last); //删除迭代器[first, last)内的元素(删除区间内的所有元素)
mp.size(); //获取map中映射的对数
mp.clear(); //清空map中的所有元素
5. queue
queue(队列):一个先进先出的容器
使用条件:
#include <queue>
using namespace std;
queue定义:
queue<int> q; //一个int型的先进先出的容器
queue容器中内容的访问:
//队列(queue)是一种先进先出的数据结构, 通过front()访问队首元素, back()访问队尾元素
q.front(); //访问队首元素
q.back(); //访问队尾元素
queue常用函数:
q.push(x); //将x入队
q.front(); //访问队首元素
q.back(); //访问队尾元素
q.pop(); //队首元素出队
q.empty(); //判空
q.size(); //获取队列中元素的个数
6. stack
stack(栈):一个后进先出的容器
使用条件:
#include <stack>
using namespace std;
stack定义:
stack<int> st; //一个int型的后进先出的容器
stack容器中内容的访问:
//栈(stack)是一种后进先出的数据结构, 只能通过top()访问栈顶元素
st.top(); //访问栈顶元素
stack常用函数:
st.push(x); //将x入栈
st.top(); //访问栈顶元素
st.pop(); //栈顶元素出队
st.empty(); //判空
st.size(); //获取栈中元素的个数