顺序容器

来源:互联网 发布:专业音频编辑软件 编辑:程序博客网 时间:2024/04/27 14:39
1.顺序类型的基础知识:(容器元素的访问是可以和数组类似的,list[0],list[list.size()-1])
vector:适用于尾部的插入删除,数组;
eg:vector<string> svec;
auto iter=svec.begin();
iter=svec.insert(iter,word);//iter一直是指向首元素,向首元素之前添加性能不高,需要移动很多元素


deque:类似队列,适用于头(插入),尾(删除),数组,适用于频繁的随机访问;deque<int> ideq;ideq.push_back();//读取数据时是顺序
    ideq.push_front();//读取数据是逆序


list:试用与插入排序操作,链表,不适用于随机的访问;list迭代器不支持<操作(原因:list是将元素以链表形式保存,两个指针的大小关系以元素的大小关系不一定是吻合的);只支持递增,递减,==,!=操作;


array是固定大小的,没有capacity;
2.构成迭代器范围的迭代器:
两个迭代器begin和end
需指向同一个容器中的元素,或者是容器最后一个元素之后的位置;且begin 反复进行递增运算可保证达到end;


3.索引:使用迭代器类型vector<int>::iterator来索引int的vector中的元素;
读取:使用list<string>::value_type来读取string的list中的元素;
写入:使用list<string>::reference像string的list中写入元素;


4.begin和cbegin函数的不同:
cbegin是c++标准新引入的,用来和auto结合使用。返回指向容器第一个元素的const容器(多用于不需要改变元素的值的情况);
eg:const vector<int> it;auto it1=it.begin();


begin是被重载过的,两个版本:其中一个是const成员函数,返回const迭代器;另一个则返回普通的迭代器;


5.六种创建和初始化vector对象的方法://六种创建和初始化vector对象的方法
vector<int> ilist1;//默认初始化,size的值为0,capacity=0(尚未分配存储空间)


vector<int> ilist2(ilist1);//拷贝初始化,ilist1必须与ilist2的类型相同,2与1有相同的容量和元素
//等价于ilist2=ilist1;


vector<int> ilist3 = {1,2,3,4,5,6,7};//列表中的元素必须与ilist的元素类型相容,对于整型则直接拷贝,对于其他类型,则类型转换
//等价于Ilist3{1,2,3,4,5,6,7}


vector<int> ilist4(ilist1.begin() + 1, ilist1.end() - 1);//获取一个序列的子序列,要求范围中元素类型与初始化的容器内容相容


vector<int> ilist5(7);//默认初始化,ilist5包含7个元素,每个元素进行缺省值的初始化;适用于初期元素数量已知,元素值需动态获取


vector<int> ilist6(7,3);//指定值初始化,ilist6有七个元素,且初始值为3


6.拷贝构造函数:
a.拷贝初始化:接收一个容器创建其拷贝的构造函数;这样的初始化是得到和此容器(一模一样:即容器类型,元素类型都要相同)
b.范围初始化:接收两个迭代器创建的拷贝的构造函数;只想拷贝其中的一部分元素(容器类型可以不同,元素类型相容)即可;


7.不同元素类型的赋值:
eg:list<char *> slist={"hello","world","!"};
vector<string> svec;
svec.assign(slist.begin(),slist.end());


8.判定vector<int>是否相等(==):
当两个vector包含的元素个数相同,且对位元素都相等时,两个相等,否则不等;他们的capacity不会影响相等性的判定;capacity表示分配的内存大小,而size表示实际存储的元素个数;


9.判断vector<int>和list<int>是否相等:首先判断size是否相等,相等则继续判断各个元素是否相等;


10.<使用的限制:容器类型必须相同,器元素类型也相同。且元素类型要支持该运算符;


11.判断偶,奇的两种方法:
if(i & 1==true)//则为奇数;
if(i%2==1)//则为奇数;


12.在容器中insert()元素之后会使插入元素之前的指向容器的迭代器,引用和指针失效,在容器的使用过程中药注意这一点;


13.//四种访问容器的首元素的方法
cout << ivec.at(0) << endl;//当容器为空时,容易出现out_of_range异常;
cout << ivec[0] << endl;
cout << ivec.front() << endl;
cout << *ivec.begin() << endl;


14.顺序容器的插入,删除;
插入:insert(参数1,参数2)//参数1是插入位置之后,参数2是要插入的元素;
删除:erase(参数);//删除当前参数


单向链表(forword_list<int> flist):auto prev=flist.before_begin();
auto curr=flist_begin();
删除:curr=flist.erase_after(prev),curr指向删除的下一个元素;
插入:curr=flist.insert_after(curr,""),curr指向插入的元素;


15.设置容器元素多少:
list_1.resize();//比原来的元素多时,补齐;多时,删除;
list_1.reserve(100);//开辟100个内存空间,再次申请内存时,会以此为基数,呈2倍增长;
注:对于元素是类类型,单参数resize版本要求该类型必须有一个默认构造函数;


16.编译器开辟的空间是一般是成倍增长的;1,2,4,8,16...
0 0
原创粉丝点击