顺序容器类型
vector
list
deque
string
概述
vector、string 支持随机访问,速度快,在尾部插入/删除速度快
list 双向链表,只支持双向顺序访问
deque 双向队列,支持快速随机访问,在头尾插入/删除速度很快
选择容器
一般情况下选择vector
如果元素很小,不要使用list
如果要求随机访问,应使用vector或者deque
如果要求中间插入元素,应使用list
如果需要中间插入之后随机访问,先用list再拷贝到vector
顺序容器通用操作(C11)
//类型别名
iterator //此容器的迭代器类型
const_iterator //不能修改元素的迭代器类型
size_type //无符号整数
difference_type //带符号整数,保存两个迭代器之间的距离
reference //元素的左值类型;与value_type&含义相同
const_reference //即const value_type&
//构造函数
C c; //默认构造函数
C c1(c2); //构造c2的拷贝
C c(b, e); //拷贝迭代器b和e之间的元素, 不包含e指向的元素,即[b, e)
C c{a, b, c...}; //列表初始化
//赋值与swap
c1 = c2; //将c1中的元素替换成c2的元素
c1 = {a, b, c...}; //将c1中的元素替换成列表中的元素
a.swap(b); //交换a和b的元素
swap(a, b);
//大小
c.size() //c中元素的数目
c.max_size() //c可保存的最大元素数目
c.empty() //判断是否没有元素
//添加元素
c.push_back(t) //在尾部插入元素,返回void
c.emplace(args) //使用元素构造函数构造元素,返回void
c.insert(p, t) //在p之前插入元素,返回指向新元素的迭代器
c.emplace(p, args) //同上
c.insert(p, n, t) //在迭代器p之前插入n个值为t的元素,返回指向新插入的第一个元素的迭代器,若n是0,返回p
c.insert(p, b, e) //将b和e之间的元素插入到p之前,返回值同上
c.insert(p, il) //il是元素值列表{a, b, c...},返回值同上
//访问元素
c.back() //返回尾元素的引用
c.front() //首元素
c[n] //返回第n个元素的引用
c.at(n) //同上
//删除元素
c.pop_back() //删除尾元素,返回void
c.pop_front() //
c.erase(p) //删除迭代器p指向的元素,返回p后面的元素的迭代器
c.erase(b, e) //删除[b, e),返回e
c.clear() //删除所有元素,返回void
//改变容器大小
c.resize(n) //若n < c.size(),则删除后面元素,否则,新元素进行初始化
c.resize(n, t) //任何新添加的元素用t初始化
//关系运算符
==, !=
<, <= , >, >=
//获取迭代器
c.begin(), c.end()
c.cbegin(), c.cend()
//反向容器的额外成员
reverse_iterator
const_reverse_iterator
c.rbegin(), c.rend()
c.crbegin(), c.crend()
使用顺序容器
#include <vector>
using std::vector;
class Person{
Person(){
name = "";
age = -1;
}
Person(const std::string name_, int age_):
name(name_), age(age_) {}
string name;
int age;
};
//容器定义和初始化
vector<int> vi1; //默认构造函数
vector<vector<int>> vvi;
vector<int> vi2 = {1, 2, 3}; //或者vector<int> vi2{1, 2, 3};
vector<int> vi3(vi2);
vector<int> vi4(vi3.begin(), vi3.end());
vector<int> vi5(10, -1); //10个值为-1的元素
//使用迭代器操作容器元素
vector<int>::iterator b = vi2.begin(), e = vi2.end();
for(vector<int>::iterator i = b; i != e; i++){
(*i)++;
std::cout << *i;
}
//赋值和swap, 注意赋值操作会使容器内部的迭代器、引用、指针失效
vi1 = vi2;
vi1 = {1, 2, 3};
swap(vi1, vi2); //swap通常比从vi2想vi1拷贝元素快得多
vi1.swap(vi2);
vi3.assign(vi1.cbegin(), vi1.cend());
vi3.assign(10, -1); //10个-1
//容器大小和比较
vi1.empty();
vi1.size();
vi1.max_size();
vi1 == vi2
vi1 < vi2
//插入
vector<Person> p("xxx", 20);
p.push_back(Person("xxx", 21)); //在尾部插入元素
p.emplace_back("xxx", 22); //使用两个参数的构造函数构造元素,注意push_back和
//emplace_back的区别
p.insert(p.begin(), Person("xxx", 23)); //insert(x, y)表示在x之前插入y
p.emplace(p.begin(), "xxx", 24); //同insert
//其他见上面通用操作