基本概念
vector举例介绍STL
- 类似一个数组的结构
- 迭代器理解为指针即可:
vector<int>::iterator
定义
push_back
是尾插法
- 注意:起始迭代器
v.begin
指向第一个。v.end
指向最后一个的下一个
遍历
- 方法一:for循环
- 方法二:for_each
写一个每次遍历都运行的函数:
用for_each遍历
存放自定义类型
遍历方式:
- 另一种集合:存储对象的地址。
- 这里
person *p = (*it) ; p->m_Name;
- 记住:
*it
就是<>里面
的类型
vector嵌套
如何遍历最里面的 v1,v2… 这些内部小容器呢
void test2() {vector<vector<int>> v;vector<int> v1; v1.push_back(1);vector<int> v2; v2.push_back(2);vector<int> v3; v3.push_back(3);vector<int> v4; v4.push_back(4);v.push_back(v1);v.push_back(v2);v.push_back(v3);v.push_back(v4);for (vector<vector<int>>::iterator it = v.begin(); it != v.end(); it++) {vector<int> out = *it; //it本质是指针,*it才是内容,也就是vector<int>类型的内容for (vector<int>::iterator vit = out.begin(); vit != out.end(); vit++) {int val = *vit;cout << val<< endl;}}
}
string容器
* 内部维护char*
指向的字符串
构造方式:
- 用
char *
类型指针,指向一个字符串
赋值操作
- 最基础的 = 赋值
- 用assign赋值
拼接
查找和替换
- find从左往右,rfind从右往左。
- 返回值是 -1 就是没有找到。
字符串比较
逐个比较ASCII码。前 - 后。
string中某个字符存取
插入和删除
截取子串
vector容器(单端数组)
基本概念
和数组类似,但是可以动态拓展。
赋值
容量和大小
插入和删除
- 如果要改变插入/删除位置,迭代器位置写为
v.begin()+n
即可
数据存取
两个vector互换数据
- 用途:缩减容量
- 只用resize,会缩减大小,但是不会缩减容量
- 使用拷贝构造函数创建匿名对象,匿名对象与已知v进行交换。匿名对象执行完就删除。
预留空间
- 统计扩容次数
- reserve操作:
deque容器(双端数组)
创建
- 使用
const
是为了防止deque容器内的内容被修改
赋值
大小
插入和删除
和vector一样
数据存取
排序
使用sort这种算法时,记得加<algorithm>
库
stack容器(栈)
- 不允许有遍历,只能访问栈顶
常用接口:
queue容器(队列)
list容器(双向链表)
创建
赋值和交换
大小操作
插入和删除
数据存取
- 注意点:
反转和排序
- 链表没有随机访问迭代器,所以不能用标准算法
- 自定义比较原则:
- 给
L1.sort
传入比较规则
自定义数据类型排序
- 自定义数据类型,要指定排序规则
set容器(集合)
构造和赋值
- 插入数据只有
st.insert()
方式
大小和交换
插入和删除
- 没有头插尾插
查找和统计
set和multiset区别
- 判断是否插入成功:insert()返回值是一个对组(pair)。这个对组里面,一个是迭代器,一个是bool值
pair对组
成对出现的数据,可以一次返回两个数据
指定排序规则
- 仿函数,重载
()
符号。仿函数的本质是一个类
- 标准数据类型:
- 使用比较规则的位置
- 在一个类里面写比较规则
- 比较规则在set初始化时候就声明好,然后再插入
- 自定义数据类型:一般都要自己指定规则
map容器(哈希表)
创建
- map内部都是pair类型
#include<stdio.h>
#include<iostream>
#include<map>
using namespace std;void printmap(map<int, int> &m) {for (map<int, int>::iterator it = m.begin(); it != m.end(); it++) {cout << (*it).first << "——" << it->second << endl; //it 本质是指针,既可以直接用->,也可以*it定位到对象本身,再用.}
}void test() {map<int, int> map;pair<int, int> p1(1, 10);pair<int, int> p2(2, 20);pair<int, int> p3(3, 30);map.insert(p1);map.insert(p2);map.insert(p3);printmap(map);
}int main() {test();
}
大小和交换
插入和删除
查找和统计
排序
- 和set有些类似,都是利用仿函数定义规则