目录
一.P343 unique
二.P358 插入迭代器
三.P359 iostream迭代器
四.P384 检测insert的返回值(关联容器)
五.P386 删除元素(关联容器)
六.P387 map的下标操作
unqiue函数会将容器相邻的元素的重复项“删除”。
vector v = { 1, 2, 3, 3, 3, 4, 4, 5 };
unique(v.begin(), v.end());
for (auto n : v) cout << n << " ";
//结果:
1 2 3 4 5 4 4 5
这里需要注意几点:
1.只会将容器内相邻元素重复项删除,使用前请确保同样元素相邻
如果内部这样存储:1,2,2,3,2,4,3,5
那么得到的将是:1,2,3,2,4,3,5,5
2.参数范围是左闭右开,右边参数是最后一个参与unique的下一个参数。
3.返回值是最后一个不重复元素的下一个位置。
vector v = { 1, 2, 3, 3, 3, 4, 4, 5 };
//unique之后:1 2 3 4 5 4 4 5
//返回: ^
vector v = { 1, 2, 2, 3, 2, 4, 3, 5 };
//unique之后:1 2 3 2 4 3 5 5
//返回: ^
这是一种容器适配器,接受一个容器作为参数,返回一个迭代器。
有三种类型:
类型 | 含义 | 使用 |
---|---|---|
back_inserter(v) | 相当于v.push_back | auto i = back_inserter(v); i = val; // == v.push_back(val); |
front_inserter(v) | 相当于v.push_front | auto i = front_inserter(v); i = val; // == v.push_front(val); |
inserter(v, p) | 相当于v.insert,在p迭代器前插入元素 | auto i = inserter(v, v.end()); i = val; // == v.insert(v.end(), val); |
istream_iterator:
istream_iterator it(cin), end;
vector v(it, end);//将键盘数据写入数组
vector构造函数内会调用迭代器++操作,对于istream迭代器而言,++操作与in >>同义。
空的istream迭代器默认是尾后迭代器。
ostream_iterator:
ostream_iterator it(cout, " ");
vector v = { 1, 2, 3, 4, 5, 6 };
for (auto n : v)
(*it)++ = n;//将vector输出到显示器
ostream迭代器有两种构造:
ostream_iterator |
out将T类型数据写入os |
ostream_iterator |
out将T类型数据写入os,每次写入后输出一个d字符串 |
对于ostream迭代器而言,=操作与out <<同义。
同时,解引用*和++操作可以忽略省去。
ostream_iterator it(cout, " ");
vector v = { 1, 2, 3, 4, 5, 6 };
for (auto n : v)
it = n;
不重复型关联容器的insert会返回一个pair类型对象,first成员是容器迭代器,second成员是bool类型。
插入成功,first是该元素迭代器,second是true。
插入失败,first是该已存在的元素的迭代器,second是false。
map的erase有三种参数类型,返回值也分别不同。
形式 | 返回值 |
---|---|
erase(val) //删除关键字为val的元素 | 删除的元素数量 |
erase(iterator) //删除指定迭代器的元素 | iterator的下一个迭代器 |
erase(iterator_first, iterator_second) //删除指定迭代器范围内的元素,范围:[first, second) | iterator_second |
对map进行查找操作,需要看使用场景选择不同方式。
查找方式 map |
常见场景 |
---|---|
m[k] | 查找k,没有时希望添加k。 |
m.at(k) | 查找k,没有时希望抛异常(out_of_range) |
m.find(k) | 查找k,没有时不想改变map,也不想抛异常。 |
如有错误,敬请斧正