第九章:顺序容器

1. 顺序容器包括

      接受容器大小做形参的构造函数只是用于顺序容器,而关联容器不支持这种初始化.

2.C++,大多数类型都可用作容器的元素类型.容器元素类型必须满足以下两个约束:

      1).元素类型必须支持赋值运算

      2).元素类型的对象必须可以复制

:没有元素是引用类型的容器,也没有元素是IO类型的容器

3.使用迭代器编写程序时,必须留意那些操作会使迭代器失效.使用无效的迭代器将会导致严重的运行错误.(在使用迭代器时,通常可以编写程序使得要求迭代器有效的代码范围相对较短,然后,在该范围内,严格检查每一条语句,判断是否有元素添加或删除,从而相应的调整迭代器的值.

关于容器大小比较,其原理与泛型算法一样.需要支持原子的大小比较操作符.

#include <iostream>
#include <vector>
#include <set>
#include <list>
#include <string>
#include <bitset>
#include <algorithm>

using namespace std;

struct Usr
{
	int i;
	string strUiD;			//用户标示ID
	string strSrnName;		//用户名称
	string strNickName;		//昵称
	string strDesc;			//个人简介
	string strGender;		//性别	
	string strIcon;			//头像图片
	string strVtitle;		//暂时不知
	string strVType;		//用户是够通过真实身份验证(0未通过)
	
	Usr( string strUiD )
	{
		this->strUiD = strUiD;
	}
};
inline bool operator== ( const Usr& usrOne,const Usr& usrTwo )
{
	if ( usrOne.strUiD == usrTwo.strUiD  )
	{
		return true;
	}
	return false;
}
void main()
{	
	vector<Usr> vecUsr;
	Usr usr( "ysl" );
	vecUsr.push_back( usr );

	usr.strUiD = "abc";
	usr.strVtitle = "初级";
	vecUsr.push_back( usr );
	
	usr.strUiD = "abc";
	vector<Usr>::const_iterator cIter = find( vecUsr.begin(),vecUsr.end(),usr );
	if ( cIter != vecUsr.end() )
	{
		cout<<cIter->strVtitle<<endl;
	}
	system( "pause" );
}


4.顺序容器的操作

●顺序容器库中添加元素的操作

c.push_back(t)      在容器c的尾部添加值为t的元素,返回void

c.push_front(t)      在容器c的前端添加值为t的元素,返回void(只适用listdeque容器类型)

c.insert(p,t)                   再迭代器p所指向的元素前插入值为t的新元素.返回指向新添加元素的迭代器

c.insert(p,n,t)                添加n个值为t的新元素,返回void类型

c.insert(p,b,e)               在迭代器p所指向的元素前插入有迭代器be标记的范围内的元素,返回void

:不要存储end操作迭代器,添加或删除dequevector容器的元素都会导致存储的迭代器失败.

●顺序容器大小的操作

c.maxsize()                   返回容器c可容纳的最多元素个数

c.resize(n)                     调整容器c的大小,如果n<c.size()则删除多出来的元素,否则使用默认初始化多余的元素

c.resize(n,t)                   调整c的大小,如果n<c.size()添加元素t

●访问顺序容器的元素

c.back()                        返回容器c的最后一个元素的引用

c.front()                        返回容器c的第一个元素的引用

●删除顺序容器内元素的操作

c.erase(p)                      删除p所指的元素

c.erase(b,e)                   删除b-e之间的元素

c.clear()                        删除容器的所有元素

c.pop_back()                删除容器的最后一个元素

c.pop_front()                删除容器的第一个元素(仅适合listdeque)

注意:pop_frontpop_back函数的返回值并不是删除的元素的值,而是void

●赋值与swap

c1 == c2                       删除容器c1的所有元素,然后将c2的元素复制给c1

c1.swap(c2)                  交换内容:调用玩该函数后,c1中存放的是c2原来的元素.c1存放的是c2原来的元素,该函数的执行速度通常要比将c2复制到c1的操作快

c.assign(b,e)                 重新设置c的元素:将迭代器be标志的范围内所有元素复制到c(它也是先清空c)

c.assign(n,t)                  将容器c从新设置为存储n个值为t的元素

注意:关于swap的一个重要的问题在于:该操作不会删除或插入任何元素,而且保证在正常时间内实现交换.由于容器内没有移动任何元素,因此迭代器不会失效

举例如下:

            vector<int>vec1;

            vector<int>vec2;

            for (inti = 0;i<10;i++)

            {

                   vec1.push_back(i);

            }

 

            for (intj = 0;j<5;j++)

            {

                   vec2.push_back(j+20);

            }

            std::vector<int>::iteratoriter1 =vec1.begin();

            std::vector<int>::iteratoriter2 =vec2.begin();

      

            vec1.swap(vec2);

            cout<<"vec1.begin= "<<*iter1<<"/nvec2.begin= "<<*iter2<<endl;

5.对于vector容器,系统在分配容量时要比当前所需的空间多一些.vector容器预留了这些额外的储存区,用于存放新添加的元素.

      sizecapacity的区别:前者值容器当前拥有的元素个数,后者值容器在必须分配新存储空间之前可以存储的元素的总数.

reserve(n)    设置vector应该预留多少个元素的存储空间

capacity()    返回分配新存储之前可以存储空间之前可以存储的元素总数

      vector容器不得不分配新的存储空间时,以加倍当前容量的分配策略实现重新分配

6.使用容器类型的法则:

1).如果程序要求随机访问元素,则应该使用vector或者deque容器;

2).如果程序必须在容器的中间位置插入或删除元素,则应采用list容器

3).如果程序不是在容器的中间位置,而是在容器的首部或者尾部插入或删除元素,则应采用deque容器

4).如果只需在读取输入时在容器的中间位置插入元素,然后随机访问元素,则可考虑在输入时将元素读入到一个list容器,接着对此容器重新排序,以适应其顺序访问,然后将其复制到vector容器.

注意:通常来说,除非找到选择使用其他容器的更好的理由,否则vector容器都是最佳选择,并建议多使用迭代器而非下标

7.string不支持带有单个容器长度作为参数的构造函数(其函数很多,而且在实际上用不了那么多,所以在此偷下懒,省略,如果需要用到它则可查阅MSDN).

8.除了顺序容器,标准库还提供了=三种顺序容器适配器:queue,priority_queuestack:需要包含的相关头文件:#include<stack>

                                                #include<queue>

stack适配器所关联的基础容器可以是任意一种顺序容器,queue适配器要求其关联的基础容器必须提供push_front操作,因此只能建立在list,而不能建立在vector

●栈适配器:

      s.empty()     如果栈为空

      s.size()         返回栈种元素的个数

      s.pop()         删除栈顶元素,但不返回其值

      s.top()          返回栈顶元素的值,但不删除它

      s.push()        在栈顶压入新元素

●队列和优先级队列支持的操作

      q.empty()     如果队列为空

      q.size()         返回队列中元素的个数

      q.pop()         删除队首元素,但不删除其值

      q.front()       返回队首元素的值(只是用于队列)

      q.back()       返回队尾元素的值,但不删除它(只是用于队列)

      q.top()         返回具有最高有优先级的元素值(该操作只适于优先级队列)

      q.push()       对于queue,在队尾压入一个新元素

                           priority_queue,在基于优先级的适当位置插入新元素                 

常见问题列举:

error C2653: 'vector<int,class std::allocator<int> >' : is not a class or namespace name

error C2065: 'size_type' : undeclared identifier

error C2146: syntax error : missing ';' before identifier 'ix'

error C2065: 'ix' : undeclared identifier

error C2143: syntax error : missing ')' before '++'

warning C4552: '!=' : operator has no effect; expected operator with side-effect

error C2059: syntax error : ';'

error C2059: syntax error : ')'

error C2143: syntax error : missing ';' before '{'

处理方法:vector前加上std::

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值