这篇文章就介绍一些基本知识。
介绍操作的时候介绍贴合的操作,比如顺序容器只在尾部操作,不考虑对中间元素的低效操作。
1.迭代器---C++Primer 3.4P96
允许的操作
①指向
*iter
iter->mem
②移动
++iter
--iter
③比较
iter1 == iter2
iter1 != iter2
注意:比较操作,只有少数迭代器支持<,>这种关系运算符。推荐使用!=,这样代码的使用范围更广。
2.顺序容器---C++Primer 第九章P292
这里主要说vector和string
(1)添加元素
①c.push_back(t)
②c.emplace_back(args)
注意:push与emplace的不同
push是拷贝t对象进入。
而emplace就是用传入的参数,构建一个对象。
当然如果构造函数不是explicit的,那么也可以在push中传入参数。
(2)访问元素
①首尾元素
c.back()
c.front()
②随机访问
c[n]
c.at(n)
注意:[]与at的不同
at提供越界抛出异常。
[]不提供越界异常,只是行为未定义。
(3)删除元素
①弹出尾部元素
c.pop_back()
②删除所有元素
c.clear()
注意:这两个函数返回值为void。
3.关联容器
主要是说:set、map、unordered_set、unordered_map
前两者是用平衡二叉树(红黑树)实现的。后两者是用哈希函数实现的。
但是关联容器更为复杂。两种set中存储的就是元素本身,而两种map中的每一个元素是一个pair。
(1)插入元素
c.insert(v)
c.emplace(v)
注意:返回值。关联容器插入操作的返回值是一个pair<iterator, bool>
iterator指示,插入元素被放置的位置。
bool指示,到底是插入成功了,还是原本就存在该元素了。
如果原来就存在该元素了,是不能通过insert操作来改变元素的值的。
(2)下标操作(访问元素)
c[k]
c.at(k)
c.find(k)
用关键字k进行搜索。如果搜索到就返回值,如果没有就新增一个以k为关键字的元素,并进行值初始化。
注意:①可以使用这个操作来进行,某个关键字对应元素的值的修改操作。
②at与下标的不同是,如果没找到,at会抛出异常,而不是新建一个元素。
③find如果没有找到,会返回尾后迭代器。
(3)删除元素
c.erase(k)
c.erase(iter)
特别注意的是这个返回值:
①如果是C++98
擦除某个key,返回擦除个数。map当然最多返回1
擦除某个pos,返回void
②如果是C++11
擦除某个key,同上。
擦除某个pos,返回被擦除元素的下一个元素的iter!