当前位置: 首页 > news >正文

农家乐网站 建设网络营销师证书含金量

农家乐网站 建设,网络营销师证书含金量,物流公司做网站有用吗,ps制作网站模板内容来自《C Primer#xff08;第5版#xff09;》9.2.1 迭代器、9.2.3 begin和end成员、9.3.6 容器操作可能使迭代器失效、10.4.3 反向迭代器 目录 1. 迭代器 1.1 迭代器范围 1.2 使用左闭合范围蕴含的编程假定 2. begin和end成员 3. 容器操作可能使迭代器失效 3.1 编…内容来自《C Primer第5版》9.2.1 迭代器、9.2.3 begin和end成员、9.3.6 容器操作可能使迭代器失效、10.4.3 反向迭代器 目录 1. 迭代器 1.1 迭代器范围 1.2 使用左闭合范围蕴含的编程假定 2. begin和end成员 3. 容器操作可能使迭代器失效 3.1 编写改变容器的循环程序 3.2 不要保存end返回的迭代器 4. 反向迭代器 4.1 反向迭代器需要递减运算符 4.2 反向迭代器和其他迭代器间的关系 1. 迭代器 与容器一样迭代器有着公共的接口如果一个迭代器提供某个操作那么所有提供相同操作的迭代器对这个操作的实现方式都是相同的。例如标准容器类型上的所有迭代器都允许我们访问容器中的元素而所有迭代器都是通过解引用运算符来实现这个操作的。类似的标准库容器的所有迭代器都定义了递增运算符从当前元素移动到下一个元素。 表1列出了容器迭代器支持的所有操作其中有一个例外不符合公共接口特点——forward_list迭代器不支持递减运算符--。表2列出了迭代器支持的算术运算这些运算只能应用于string、vector、deque和array的迭代器。我们不能将它们用于其他任何容器类型的迭代器。 表1 迭代器的运算符*iter返回迭代器iter所指元素的引用iter-mem解引用iter并获取该元素的名为mem的成员等价于(*iter) .memiter令iter指示容器中的下一个元素--iter令iter指示容器中的上一个元素iter1 iter2判断两个迭代器是否相等不相等如果两个迭代器指示的是同一个元素或者它们是同一个容器的尾后迭代器则相等反之不相等iter1 ! iter2 表2 迭代器支持的运算iter n迭代器加上一个整数值仍得一个迭代器迭代器指示的新位置与原来相比向前移动了若干个元素。结果迭代器或者指示容器内的一个元素或者指示容器尾元素的下一位置iter - n迭代器减去一个整数值仍得一个迭代器迭代器指示的新位置与原来相比向后移动了若干个元素。结果迭代器或者指示容器内的一个元素或者指示容器尾元素的下一位置iter1 n迭代器加法的复合赋值语句将iter1加n的结果赋给iter1iter1 - n迭代器减法的复合赋值语句将iter1减n的结果赋给iter1iter1 - iter2两个迭代器相减的结果是它们之间的距离也就是说将运算符右侧的迭代器向前移动差值个元素后将得到左侧的迭代器。参与运算的两个迭代器必须指向的是同一个容器中的元素或者尾元素的下一位置、、、迭代器的关系运算符如果某迭代器指向的容器位置在另一个迭代器所指位置之前则说前者小于后者。参与运算的两个迭代器必须指向的是同一个容器中的元素或者尾元素的下一位置 1.1 迭代器范围 Note 迭代器范围的概念是标准库的基础。 一个迭代器范围iterator range由一对迭代器表示两个迭代器分别指向同一个容器中的元素或者是尾元素之后的位置one past the last element。这两个迭代器通常被称为begin和end或者是first和last可能有些误导它们标记了容器中元素的一个范围。 虽然第二个迭代器常常被称为last但这种叫法有些误导因为第二个迭代器从来都不会指向范围中的最后一个元素而是指向尾元素之后的位置。迭代器范围中的元素包含first所表示的元素以及从first开始直至last但不包含last之间的所有元素。 这种元素范围被称为左闭合区间left-inclusive interval其标准数学描述为 [begin, end) 表示范围自begin开始于end之前结束。迭代器begin和end必须指向相同的容器。end可以与begin指向相同的位置但不能指向begin之前的位置。 对构成范围的迭代器的要求 如果满足如下条件两个迭代器begin和end构成一个迭代器范围 它们指向同一个容器中的元素或者是容器最后一个元素之后的位置且我们可以通过反复递增begin来到达end。换句话说end不在begin之前。WARNING 编译器不会强制这些要求。确保程序符合这些约定是程序员的责任。 1.2 使用左闭合范围蕴含的编程假定 标准库使用左闭合范围是因为这种范围有三种方便的性质。假定begin和end构成一个合法的迭代器范围则 如果begin与end相等则范围为空如果begin与end不等则范围至少包含一个元素且 begin指向该范围中的第一个元素我们可以对begin递增若干次使得beginend 这些性质意味着我们可以像下面的代码一样用一个循环来处理一个元素范围而这是安全的 while (begin ! end) {*begin val;//正确范围非空因此begin指向一个元素begin; //移动迭代器获取下一个元素 } 给定构成一个合法范围的迭代器begin和end若 beginend则范围为空。在此情况下我们应该退出循环。如果范围不为空begin指向此非空范围的一个元素。因此在while循环体中可以安全地解引用begin因为begin必然指向一个元素。最后由于每次循环对begin递增一次我们确定循环最终会结束。 2. begin和end成员 begin和end操作生成指向容器中第一个元素和尾元素之后位置的迭代器。这两个迭代器最常见的用途是形成一个包含容器中所有元素的迭代器范围。 表3 获取迭代器操作beginendrbeginrendcbegincendcrbegincrend 如表3所示begin和end有多个版本带r的版本返回反向迭代器以c开头的版本则返回const迭代器 liststring a { Milton,Shakespeare,Austen }; auto itl a.begin(); //liststring::iterator auto it2 a.rbegin(); //liststring::reverse_iterator auto it3 a.cbegin(); //liststring::const_iterator auto it4 a.crbegin();//liststring::const_reverse_iterator 不以c开头的函数都是被重载过的。也就是说实际上有两个名为begin的成员。一个是const成员返回容器的const_iterator类型。另一个是非常量成员返回容器的iterator类型。rbegin、end和rend的情况类似。当我们对一个非常量对象调用这些成员时得到的是返回iterator的版本。只有在对一个const对象调用这些函数时才会得到一个const版本。与const指针和引用类似可以将一个普通的iterator转换为对应的const_iterator但反之不行。 以c开头的版本是C新标准引入的用以支持auto与begin和end函数结合使用。过去没有其他选择只能显式声明希望使用哪种类型的迭代器 //显式指定类型 liststring::iterator it5 a.begin(); liststring::const_iterator it6 a.begin();//是iterator还是const_iterator依赖于a的类型 auto it7 a.begin(); //仅当a是const时it7是const_iterator auto it8 a.cbegin();//it8是const_iterator 当auto与begin或end结合使用时获得的迭代器类型依赖于容器类型与我们想要如何使用迭代器毫不相干。但以c开头的版本还是可以获得const_iterator的而不管容器的类型是什么。 Best Practices 当不需要写访问时应使用cbegin和cend。 3. 容器操作可能使迭代器失效 向容器中添加元素和从容器中删除元素的操作可能会使指向容器元素的指针、引用或迭代器失效。一个失效的指针、引用或迭代器将不再表示任何元素。使用失效的指针、引用或迭代器是一种严重的程序设计错误很可能引起与使用未初始化指针一样的问题。 在向容器添加元素后 如果容器是vector或string且存储空间被重新分配则指向容器的迭代器、指针和引用都会失效。如果存储空间未重新分配指向插入位置之前的元素的迭代器、指针和引用仍有效但指向插入位置之后元素的迭代器、指针和引用将会失效。对于deque插入到除首尾位置之外的任何位置都会导致迭代器、指针和引用失效。如果在首尾位置添加元素迭代器会失效但指向存在的元素的引用和指针不会失效。对于list和forward_list指向容器的迭代器包括尾后迭代器和首前迭代器、指针和引用仍有效。 当我们从一个容器中删除元素后指向被删除元素的迭代器、指针和引用会失效这应该不会令人惊讶。毕竟这些元素都已经被销毁了。当我们删除一个元素后 对于list和forward_list指向容器其他位置的迭代器包括尾后迭代器和首前迭代器、引用和指针仍有效。对于deque如果在首尾之外的任何位置删除元素那么指向被删除元素外其他元素的迭代器、引用或指针也会失效。如果是删除deque的尾元素则尾后迭代器也会失效但其他迭代器、引用和指针不受影响如果是删除首元素这些也不会受影响。对于vector和string指向被删元素之前元素的迭代器、引用和指针仍有效。注意当我们删除元素时尾后迭代器总是会失效。WARNING 使用失效的迭代器、指针或引用是严重的运行时错误。 建议管理迭代器 当你使用迭代器或指向容器元素的引用或指针时最小化要求迭代器必须保持有效的程序片段是一个好的方法。 由于向迭代器添加元素和从迭代器删除元素的代码可能会使迭代器失效因此必须保证每次改变容器的操作之后都正确地重新定位迭代器。这个建议对vector、string和deque尤为重要。 3.1 编写改变容器的循环程序 添加/删除vector、string或deque元素的循环程序必须考虑迭代器、引用和指针可能失效的问题。程序必须保证每个循环步中都更新迭代器、引用或指针。如果循环中调用的是insert或erase那么更新迭代器很容易。这些操作都返回迭代器我们可以用来更新 //傻瓜循环删除偶数元素复制每个奇数元素 vectorint vi { 0,1,2,3,4,5,6,7,8,9 }; auto iter vi.begin();//调用begin而不是cbegin因为我们要改变vi while (iter ! vi.end()) {if (*iter % 2) {iter vi.insert(iter, *iter);//复制当前元素iter 2;//向前移动迭代器跳过当前元素以及插入到它之前的元素}elseiter vi.erase(iter);//删除偶数元素//不应向前移动迭代器iter指向我们删除的元素之后的元素 } 此程序删除vector中的偶数值元素并复制每个奇数值元素。我们在调用insert和erase后都更新迭代器因为两者都会使迭代器失效。 在调用erase后不必递增迭代器因为erase返回的迭代器已经指向序列中下一个元素。调用insert后需要递增迭代器两次。记住insert在给定位置之前插入新元素然后返回指向新插入元素的迭代器。因此在调用insert后iter指向新插入元素位于我们正在处理的元素之前。我们将迭代器递增两次恰好越过了新添加的元素和正在处理的元素指向下一个未处理的元素。 3.2 不要保存end返回的迭代器 当我们添加/删除vector或string的元素后或在deque中首元素之外任何位置添加/删除元素后原来end返回的迭代器总是会失效。因此添加或删除元素的循环程序必须反复调用end而不能在循环之前保存end返回的迭代器一直当作容器末尾使用。通常C标准库的实现中end()操作都很快部分就是因为这个原因。 例如考虑这样一个循环它处理容器中的每个元素在其后添加一个新元素。我们希望循环能跳过新添加的元素只处理原有元素。在每步循环之后我们将定位迭代器使其指向下一个原有元素。如果我们试图“优化”这个循环在循环之前保存end()返回的迭代器一直用作容器末尾就会导致一场灾难 //灾难此循环的行为是未定义的 auto begin v.begin(), end v.end();//保存尾迭代器的值是一个坏主意 while (begin ! end) {//做一些处理//插入新值对begin重新赋值否则的话它就会失效begin;//向前移动begin因为我们想在此元素之后插入元素begin v.insert(begin, 42);//插入新值begin; // 向前移动begin跳过我们刚刚加入的元素 } 此代码的行为是未定义的。在很多标准库实现上此代码会导致无限循环。问题在于我们将end操作返回的迭代器保存在一个名为end的局部变量中。在循环体中我们向容器中添加了一个元素这个操作使保存在end中的迭代器失效了。这个迭代器不再指向v中任何元素或是v中尾元素之后的位置。 Tip 如果在一个循环中插入/删除deque、string或vector中的元素不要缓存end返回的迭代器。 必须在每次插入操作后重新调用end()而不能在循环开始前保存它返回的迭代器 //更安全的方法在每个循环步添加/删除元素后都重新计算end while (begin ! v.end() {//做一些处理begin;//向前移动begin因为我们想在此元素之后插入元素begin v.insert(begin, 42);//插入新值begin;//向前移动begin跳过我们刚刚加入的元素 } 4. 反向迭代器 反向迭代器就是在容器中从尾元素向首元素反向移动的迭代器。对于反向迭代器递增以及递减操作的含义会颠倒过来。递增一个反向迭代器it会移动到前一个元素递减一个迭代器--it会移动到下一个元素。 除了forward_list之外其他容器都支持反向迭代器。我们可以通过调用rbegin、rend、crbegin和 crend成员函数来获得反向迭代器。这些成员函数返回指向容器尾元素和首元素之前一个位置的迭代器。与普通迭代器一样反向迭代器也有const和非const版本。 下图显示了一个名为vec的假设的vector上的4种迭代器 下面的循环是一个使用反向迭代器的例子它按逆序打印vec中的元素 vectorint vec { 0,1,2,3,4,5,6,7,8,9 }; //从尾元素到首元素的反向迭代器 for (auto r_iter vec.crbegin();//将r_iter绑定到尾元素r_iter ! vec.crend(); //crend指向首元素之前的位置r_iter) //实际是递减移动到前一个元素cout *r_iter endl; //打印9,8,7,...,0 虽然颠倒递增和递减运算符的含义可能看起来令人混淆但这样做使我们可以用算法透明地向前或向后处理容器。例如可以通过向sort传递一对反向迭代器来将vector整理为递减序 sort(vec.begin(), vec.end());//按“正常序”排序vec //按逆序排序将最小元素放在vec的末尾 sort(vec.rbegin(), vec.rend()); 4.1 反向迭代器需要递减运算符 不必惊讶我们只能从既支持也支持--的迭代器来定义反向迭代器。毕竟反向迭代器的目的是在序列中反向移动。除了forward_list之外标准容器上的其他迭代器都既支持递增运算又支持递减运算。但是流迭代器不支持递减运算因为不可能在一个流中反向移动。因此不可能从一个forward_list或一个流迭代器创建反向迭代器。 4.2 反向迭代器和其他迭代器间的关系 假定有一个名为line的string保存着一个逗号分隔的单词列表我们希望打印line中的第一个单词。使用find可以很容易地完成这一任务 //在一个逗号分隔的列表中查找第一个元素 auto comma find(line.cbegin(), line.cend(), ,); cout string(line.cbegin(), comma) endl; 如果line中有逗号那么comma将指向这个逗号否则它将等于line.cend()。当我们打印从line.cbegin()到comma之间的内容时将打印到逗号为止的字符或者打印整个string如果其中不含逗号的话。 如果希望打印最后一个单词可以改用反向迭代器 //在一个逗号分隔的列表中查找最后一个元素 auto rcomma find(line.crbegin(), line.crend(), ,); 由于我们将crbegin()和crend()传递给findfind将从line的最后一个字符开始向前搜索。当find完成后如果line中有逗号则rcomma指向最后一个逗号——即它指向反向搜索中找到的第一个逗号。如果line中没有逗号则rcomma指向line.crend()。 当我们试图打印找到的单词时最有意思的部分就来了。看起来下面的代码是显然的方法 //错误将逆序输出单词的字符 cout string(line.crbegin(), rcomma) endl; 但它会生成错误的输出结果。例如如果我们的输入是 FIRST,MIDDLE,LAST 则这条语句会打印TSAL! 下图说明了问题所在我们使用的是反向迭代器会反向处理string。因此上述输出语句从 crbegin开始反向打印line中内容。而我们希望按正常顺序打印从rcomma开始到line末尾间的字符。但是我们不能直接使用rcomma。因为它是一个反向迭代器意味着它会反向朝着string的开始位置移动。需要做的是将rcomma转换回一个普通迭代器能在line中正向移动。我们通过调用reverse_iterator的base成员函数来完成这一转换此成员函数会返回其对应的普通迭代器 //正确得到一个正向迭代器从逗号开始读取字符直到line末尾 cout string(rcomma.base(), line.cend()) endl; 给定和之前一样的输入这条语句会如我们的预期打印出LAST。 图中的对象显示了普通迭代器与反向迭代器之间的关系。例如rcomma和rcomma.base()指向不同的元素line.crbegin和line.cend()也是如此。这些不同保证了元素范围无论是正向处理还是反向处理都是相同的。 从技术上讲普通迭代器与反向迭代器的关系反映了左闭合区间的特性。关键点在于[line.crbegin (), rcomma)和[rcomma.base(), line.cend())指向line中相同的元素范围。为了实现这一点rcomma和rcomma.base()必须生成相邻位置而不是相同位置crbegin()和cend()也是如此。 Note 反向迭代器的目的是表示元素范围而这些范围是不对称的这导致一个重要的结果当我们从一个普通迭代器初始化一个反向迭代器或是给一个反向迭代器赋值时结果迭代器与原迭代器指向的并不是相同的元素。
文章转载自:
http://www.morning.xqxlb.cn.gov.cn.xqxlb.cn
http://www.morning.nflpk.cn.gov.cn.nflpk.cn
http://www.morning.yqpzl.cn.gov.cn.yqpzl.cn
http://www.morning.ctlbf.cn.gov.cn.ctlbf.cn
http://www.morning.dyxzn.cn.gov.cn.dyxzn.cn
http://www.morning.ynlbj.cn.gov.cn.ynlbj.cn
http://www.morning.dljujia.com.gov.cn.dljujia.com
http://www.morning.qbfs.cn.gov.cn.qbfs.cn
http://www.morning.srbmc.cn.gov.cn.srbmc.cn
http://www.morning.xlztn.cn.gov.cn.xlztn.cn
http://www.morning.fwkjp.cn.gov.cn.fwkjp.cn
http://www.morning.nzlsm.cn.gov.cn.nzlsm.cn
http://www.morning.lsmnn.cn.gov.cn.lsmnn.cn
http://www.morning.mhbcy.cn.gov.cn.mhbcy.cn
http://www.morning.rcntx.cn.gov.cn.rcntx.cn
http://www.morning.rqwmt.cn.gov.cn.rqwmt.cn
http://www.morning.kaakyy.com.gov.cn.kaakyy.com
http://www.morning.wphfl.cn.gov.cn.wphfl.cn
http://www.morning.nqwz.cn.gov.cn.nqwz.cn
http://www.morning.pprxs.cn.gov.cn.pprxs.cn
http://www.morning.gbcnz.cn.gov.cn.gbcnz.cn
http://www.morning.rfwqt.cn.gov.cn.rfwqt.cn
http://www.morning.bpmfl.cn.gov.cn.bpmfl.cn
http://www.morning.ztqj.cn.gov.cn.ztqj.cn
http://www.morning.xzjsb.cn.gov.cn.xzjsb.cn
http://www.morning.rnmc.cn.gov.cn.rnmc.cn
http://www.morning.ryfq.cn.gov.cn.ryfq.cn
http://www.morning.zhiheliuxue.com.gov.cn.zhiheliuxue.com
http://www.morning.fnhxp.cn.gov.cn.fnhxp.cn
http://www.morning.lbxcc.cn.gov.cn.lbxcc.cn
http://www.morning.lzqtn.cn.gov.cn.lzqtn.cn
http://www.morning.divocn.com.gov.cn.divocn.com
http://www.morning.ryysc.cn.gov.cn.ryysc.cn
http://www.morning.gjlst.cn.gov.cn.gjlst.cn
http://www.morning.cwqpl.cn.gov.cn.cwqpl.cn
http://www.morning.txzmy.cn.gov.cn.txzmy.cn
http://www.morning.dyxlj.cn.gov.cn.dyxlj.cn
http://www.morning.wbysj.cn.gov.cn.wbysj.cn
http://www.morning.rlzxr.cn.gov.cn.rlzxr.cn
http://www.morning.tmlhh.cn.gov.cn.tmlhh.cn
http://www.morning.skfkx.cn.gov.cn.skfkx.cn
http://www.morning.hlmkx.cn.gov.cn.hlmkx.cn
http://www.morning.zfgh.cn.gov.cn.zfgh.cn
http://www.morning.srbsr.cn.gov.cn.srbsr.cn
http://www.morning.prjns.cn.gov.cn.prjns.cn
http://www.morning.dysgr.cn.gov.cn.dysgr.cn
http://www.morning.rkjb.cn.gov.cn.rkjb.cn
http://www.morning.frtt.cn.gov.cn.frtt.cn
http://www.morning.mnyzz.cn.gov.cn.mnyzz.cn
http://www.morning.wlqbr.cn.gov.cn.wlqbr.cn
http://www.morning.zglrl.cn.gov.cn.zglrl.cn
http://www.morning.qbdsx.cn.gov.cn.qbdsx.cn
http://www.morning.attorneysportorange.com.gov.cn.attorneysportorange.com
http://www.morning.rnpt.cn.gov.cn.rnpt.cn
http://www.morning.mzgq.cn.gov.cn.mzgq.cn
http://www.morning.pangucheng.cn.gov.cn.pangucheng.cn
http://www.morning.bqppr.cn.gov.cn.bqppr.cn
http://www.morning.nxbkw.cn.gov.cn.nxbkw.cn
http://www.morning.rjbb.cn.gov.cn.rjbb.cn
http://www.morning.hbfqm.cn.gov.cn.hbfqm.cn
http://www.morning.yrflh.cn.gov.cn.yrflh.cn
http://www.morning.rkfh.cn.gov.cn.rkfh.cn
http://www.morning.bwttp.cn.gov.cn.bwttp.cn
http://www.morning.hlxxl.cn.gov.cn.hlxxl.cn
http://www.morning.zshuhd015.cn.gov.cn.zshuhd015.cn
http://www.morning.wrtbx.cn.gov.cn.wrtbx.cn
http://www.morning.nxpqw.cn.gov.cn.nxpqw.cn
http://www.morning.dqdss.cn.gov.cn.dqdss.cn
http://www.morning.rahllp.com.gov.cn.rahllp.com
http://www.morning.hrqfl.cn.gov.cn.hrqfl.cn
http://www.morning.fdmfn.cn.gov.cn.fdmfn.cn
http://www.morning.dnzyx.cn.gov.cn.dnzyx.cn
http://www.morning.cxlys.cn.gov.cn.cxlys.cn
http://www.morning.mnccq.cn.gov.cn.mnccq.cn
http://www.morning.tfqfm.cn.gov.cn.tfqfm.cn
http://www.morning.zwsgl.cn.gov.cn.zwsgl.cn
http://www.morning.wfkbk.cn.gov.cn.wfkbk.cn
http://www.morning.pwlxy.cn.gov.cn.pwlxy.cn
http://www.morning.dyzbt.cn.gov.cn.dyzbt.cn
http://www.morning.rkrl.cn.gov.cn.rkrl.cn
http://www.tj-hxxt.cn/news/247816.html

相关文章:

  • 服务器购买网站昆明做网站的公司
  • 58这样网站怎么做个体工商户注册流程
  • 苏州网站开发公司有哪些个人网站设计成品
  • 信阳建设监理协会网站做一个高端网站多少钱
  • 电子商务网站建设基础考试深圳网站做的好的公司名称
  • 亚马逊欧洲站黄石市建设局网站
  • 广州站有高铁吗网页设计软件免费
  • 界面设计师网站制作优化排名
  • 彩票网站模版html加入wordpress
  • 奎文营销型网站建设专业企业网站建设定制
  • 网站要怎么样做排名才上得去聊城市建设局网站首页
  • 外汇直播室都是网站做的企业网站建立制作
  • 怎样做微信公众号小程序郑州优化网站公司有哪些
  • google seo网站 被k商城源码免费下载
  • 从化网站设计牙克石网站建设
  • 北京金创网站建设运营一个网站一年费用
  • 旅游网站开发盈利模式WordPress手机横屏显示
  • 推荐手机网站建设泰州网站建设设计
  • 潍坊哪里可以做网站wordpress语言插件
  • 网站欢迎页面在线设计江西省城乡住房建设厅网站
  • 现在建设网站落后了dw软件免费下载
  • 最便宜的视频网站建设南宁企业网站seo
  • 太原手机网站设计小程序代理加盟有哪些大品牌
  • 中国建设网官方网站证书查询南通市区有哪几家做网站的
  • 陕煤建设集团韩城分公司网站开发公司分公司如何办预售证
  • 外贸网站建站平台汕头网站建设方案推广
  • 广州做网站开发seo推广培训课程
  • 手机上做整蛊网站大型电商平台有哪些
  • 魏县住房和城乡建设局网站上海暂停娱乐场所营业通知
  • 在线解压zip网站昆明网站推广咨询平台