ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

C++ primer超详细讲解顺序容器

C++ primer超详细讲解顺序容器 顺序容器概述1顺序容器类型vector:可变数组大小支持快速访问deque双端队列支持快速随机访问在头尾位置插入/删除速度很快forward_list单向链表只支持单向顺序访问。array:固定大小数组不能添加或删除元素string:和vector类似用来保存字符容器库概览迭代器迭代器范围由一对迭代器表示通常被称为begin和end而end从来都不会指向范围中的最后一个元素而是指向尾元素之后的位置其元素范围由数学表示为[begin,end)容器定义和初始化1将一个容器初始化为另一个容器的拷贝可拷贝整个容器也可以拷贝一个指定容器的元素范围新容器和原容器的元素类型可以不同只要能将要拷贝的元素转换为要初始化的元素的类型即可123456liststring authors{nuktib,shamaus}vectorconstchar* articles{a,an,the}liststring list2(authors);//正确类型匹配dequestring authList(authors)//错误容器类型不匹配forward_liststring words(articles.begin(),articles.end())//上述正确可以将const char*元素转换为string2与顺序容器大小相关的构造函数其中一个构造函数接收一个容器大小和一个元素初始值123liststring i(10,hi)//10个strings元素每个都初始化为hivectorint v(10,-1)//10个int元素每个都初始化为-1dequestring i(10)//10个元素每个都是空的string3标准库array具有固定大小定义一个array时除了指定元素类型还要指定容器大小12arrayint,42arraystring,10内置数组不支持拷贝或对象赋值操作但array无此限制1234intdigs[10]{1,2,3}intcpy[10]digs//错误内置数组不支持拷贝和赋值arrayint,10 d{1,2,3,4,5,6,7}arrayint,10 cd//正确赋值和swap1 assign赋值函数仅顺序容器顺序容器定义了一个名为assign的成员允许我们从一个不同但相容的类型赋值或者从一个容器的子序列赋值。例123liststring name;vectorconstchar*old;name.assign(old.cbegin(),old.cend())上述代码将name中的元素替换为迭代器指定范围中的元素的拷贝assign的参数决定了容器中将有多少个元素以及他们的值是什么2使用swapswap操作交换两个相同类型容器的内容123vectorstring v1(10);vectorstring v2(20);上述交换结束后v1将会拥有20个元素v2将会拥有10个元素顺序容器操作向顺序容器添加元素1使用push_back除了array和forward_list之外每个顺序容器都支持push_back2push_frontlist,forward_list,deque容器还支持push_front将元素插入容器头部123listint l;for(inti0;i!4;i)l.push_front(i)(3)在特定位置添加元素insert函数可在特定位置添加元素每个insert元素都接受一个迭代器作为其第一个参数insert函数将元素插入到迭代器所指得位置之前虽然有些容器不支持push_front操作但他们对于insert操作无此限制因此可以将元素插入到容器开始的位置不必担心容器是否支持push_frontinsert另一个版本还接受一个元素数目和一个值将指定数目的元素添加到指定位置之前。s.insert(s.end(),10,anna) //将10个元素插入到s的末尾还可以接受一对迭代器或一个初始化列表插入1s.insert(s.end(),{thses,as,sda,dasda});使用insert的返回值12345liststring l;auto iter l.begin();string word;while(cin word)iter l.insert(iter, word);上述代码实现在一个特定位置反复插入元素第一次调用insert将刚刚读取的string插入到iter所指向的元素之前insert返回的迭代器恰好指向这个新元素我们将此迭代器赋予iter并重新开始循环读取下一个单词不断循环。访问元素所有顺序容器都存在一个front成员函数除了forward_list之外的所有顺序容器都由一个back成员函数front成员函数返回首元素的引用back成员函数返回尾元素的引用可以通过该引用修改容器中元素的值123456if(!c.empty()){c.front()42;auto vc.back()v1024;}删除元素1pop_front和pop_back成员函数分别删除首元素和尾元素,vector和stringforward_list不支持上述操作2earse成员函数erase从容器指定位置删除元素也可以删除迭代器指定的单个元素也可以删除由一对迭代器指定的范围内的所有元素上述最终均会返回指向删除的元素之后位置的迭代器。例删除所有的奇数123456789listint ls { 0,1,2,3,4,5,6,7,8,9 };auto it ls.begin();while(it ! ls.end()){if(*it % 2)it ls.erase(it);elseit;}接受一堆迭代器的erase版本允许我们删除一个范围内的元素:例 s.erase(s.begin(),s.end())特殊的forwa_list单向链表操作单向链表中由于特殊的插入和删除所以定义的函数也比较特殊before_begin():返回指向链表首元素之前不存在的元素的迭代器此迭代器不能解引用insert_after(p,t):在迭代器p之后插入元素terase_after(p)删除p所指位置之后的元素例:删除奇数元素12345678910111213forward_listint lst { 0,1,2,3,4,5,6,7,8,9 };auto pre lst.before_begin();auto cur lst.begin();while(cur ! lst.end()){if(*cur % 2)cur lst.erase_after(pre);//将cur重置为erase_after的返回值即指向cur的下一个元素else{pre cur;cur;}}复制讲解改变容器大小通过resize函数可以改变容器的大小但array不支持此操作c.resize(n)调整c为n个元素c.resize(n,t):调整c为n个元素任何新添加的元素都初始化为tvector对象是如何增长的为了支持随机访问vector将元素连续存储当不得不获取新的内存控件时vector和string通常会分配比新的控件需求更大的内存控件容器预留这些空间作为备用可以保存更多元素。capacity函数告诉我们容器在不扩张内存空间情况下可以容纳多少元素size()是指目前已经保存的元素的数目reverse(n)告诉容器至少分配容纳n给元素的空间
返回列表