本节提到过,标准库算法不会改变gtp容器大小,为什么使用back

从一个csdn的例子来看标准算法和容器,跌带器的关系
从一个csdn的例子来看标准算法和容器,跌带器的关系
发布时间: 4:49:31
编辑:www.fx114.net
本篇文章主要介绍了"从一个csdn的例子来看标准算法和容器,跌带器的关系",主要涉及到从一个csdn的例子来看标准算法和容器,跌带器的关系方面的内容,对于从一个csdn的例子来看标准算法和容器,跌带器的关系感兴趣的同学可以参考一下。
#include &iostream&
#include &vector&
#include &algorithm&
#include &vector&
#include &algorithm&
#include &iostream&
bool greater6 ( int value ) {
return value &6;
int main( ) {
vector &int& v1;
vector &int&::iterator Iter1, new_
for ( i = 0 ; i &= 9 ; i++ )
v1.push_back( i );
for ( ii = 0 ; ii &= 3 ; ii++ )
v1.push_back( 7 );
random_shuffle ( v1.begin( ), v1.end( ) );
cout && "Vector v1 is ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout && *Iter1 && " ";
cout && ")." &&
// Remove elements satisfying predicate greater6
new_end = remove_if (v1.begin( ), v1.end( ), greater6 );
cout && "Vector v1 with elements satisfying greater6 removed is/n ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout && *Iter1 && " ";
cout && ")." &&
// To change the sequence size, use erase
v1.erase (new_end, v1.end( ) );
cout && "Vector v1 resized elements satisfying greater6 removed is/n ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout && *Iter1 && " ";
cout && ")." &&
输出结果:Vector v1 is ( 7 1 9 2 0 7 7 3 4 6 8 5 7 7 ).Vector v1 with elements satisfying greater6 removed is&( 1 2 0 3 4 6 5 3 4 6 8 5 7 7 ).Vector v1 resized elements satisfying greater6 removed is&( 1 2 0 3 4 6 5 ).结果出乎我们的意料,第一次调用remove_if ()竟然没有把大于6的数字全部删除掉,还有两个7,这就要从算法、迭代器、容器的关系(1)所有的标准库算法只是操作了容器里面的元素,并不改变容器本身的性质,比如他的大小,并不改变它的大小。这从第二行输出结果看出来,容器大小不改变。(2)容器本生的性质只能通过它的成员函数来改变,比如resize()改变容器的长度,erase()删除元素,注意:必须是容器的成员函数。如本例中删除大于7的元素用的是&v1.erase (new_end, v1.end( ) );(3)remove_if ()的内部实现机制:算法是作用在底层的容器中的,把容器移动到新的位置,所以说并不是向我们想像的那样直接找到就删除大于6的元素,函数是把使谓词为假的函数复制到容器的开头部分,,,所以出现了第二行的输出结果(4)算法并不改变迭代器。一个简单的例子;vector&int&ivec.push_back(1);ivec.push_back(0);&vector &int&::iterator begin=ivec.begin();vector&int&::iterator&&end=ivec.end();find(begin,end,0);cout&&*输出结果是1,;如果这样改的话:vector&int&::iterator&result=&find(begin,end,0);cout&&*输出结果是0;此例子充分说明了标准算法不直接改变容器的迭代器,但是如果元素存在的话可以返回对应元素的迭代器,此迭代器可以用来直接操作容器,如给容器写**result=2; //ivec.at(1)变为了2;个人感觉研究源码还是有好处的,至少原理性的东西知道的话,可以使我们少犯错误,尤其是对容器的操作,标准库算法和迭代器的关系。要不然以后用起算法来的时候自以为然的话换错误的概率是相当的大的,尤其是使用算法进行一些删除,插入操作。。。
版权声明:本文为博主原创文章,未经博主允许不得转载。
本文标题:
本页链接:C++Primer 第11章-泛型算法-课后习题答案_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
C++Primer 第11章-泛型算法-课后习题答案
上传于||文档简介
&&C​+​+​P​r​i​m​e​r​ ​第1​章​-​泛​型​算​法​-​课​后​习​题​答​案
阅读已结束,如果下载本文需要使用5下载券
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩15页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
阅读(854)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
在LOFTER的更多文章
loftPermalink:'',
id:'fks_094',
blogTitle:'C++标准库--STL',
blogAbstract:'C++标准库简介 首先为了考虑通用性,如果用一种新的标准导致原有的代码不能用,那将是一件得不偿失的事情。所以为了减轻我们的负担,是程序员的开发变得简单,标准委员会决定为包装了std的那部分标准库构建新的文件名,生成新的头文件名的方法就是对于C++头文件名,去掉头文件名后的.h&iostream.h&---&iostream&&complex.h& ----&complex&对于C头文件名,在每个名字前面加上c&string.h&-----&cstring&&stdlib.h& ------&cstdlib&原有C++头文件的未来:1.C++头文件名如&iostream.h&将会继续被使用,尽管它们不在提倡范围之内,但是这些头文件的内容不命名空间std中。',
blogTag:'',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:0,
publishTime:3,
permalink:'blog/static/',
commentCount:0,
mainCommentCount:0,
recommendCount:0,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'IT飞舞者',
hmcon:'0',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}《超越C++标准库:Boost库导引》:Boost库简介-数据结构,容器,迭代器,以及算法 - 王朝网络 -
分享&&&&&当前位置: &&&&&&&&《超越C++标准库:Boost库导引》:Boost库简介-数据结构,容器,迭代器,以及算法《超越C++标准库:Boost库导引》:Boost库简介-数据结构,容器,迭代器,以及算法 00:42:54&來源:互联网&&&&  数据结构,容器,迭代器,以及算法Boost.Any  Any库支持对任意类型的值进行类型安全的存取。当需要使用可变类型(variant type)的时候,有三种可能的解决方案:  无差别的(Indiscriminate)类型,比如void*. 这种解决方案几乎永远不可能达到类型安全,要尽可能地避免使用它。支持对一组类型进行存取的可变类型。可以进行转换的类型,比如在字符串类型和数字类型之间进行转换。Any实现的是第二种解决方案,基于值的(value-based)可变类型,而且支持任意多的类型。这个库经常被用于在标准库容器中存储异构类型(heterogeneous types)。更多信息请参考&Library 6: Any.&  Any的作者是Kevlin Henney。  Boost.Array  这个库是对C风格的数组的一个包装。可以把它们作为标准库容器的函数和类型定义(typedefs)的参数。从效果上看,这使得我们可以像对待标准库容器那样对待常规数组。这么做之所以有用是因为它在不影响效率的情况下增加了安全性,而且可以用统一的语法来处理标准库容器和常规数组。第二个理由意味着我们可以把常规数组应用于绝大多数需要对容器类型进行操作的函数。通常情况下,当运行效率要求最好使用常规数组而不是std:;vector的时候,考虑使用Array类。  Array的作者是Nicolai Josuttis。他借用Matt Austern和Bjarne Stroustrup的思想,构建了这个库。  pressed_pair  这个库由一个单独的参数化类型,compresed_pair组成,它非常类似于标准库的std::pair。与std::pair的不同之处在于,boost::compressed_pair会对模板参数进行判断,看看它们是否为空,如果有空参数,就使用针对空参数的优化方法对pair的大小(size)进行压缩。  当pair的模板参数类型可能为空的时候,使用pressed_pair来对pair进行存储。  Compressed_pair的作者是Steve Cleary,Beman Dawes,Howard Hinnant,以及John Maddock。  Boost.Dynamic_bitset  Dynamic_bitset库很大程度上类似于std::bitset,不同之处在于std::bistset把位数(也就是容器的大小)作为参数,而boost::dynamic_bitset支持运行时刻对容器大小进行调整。尽管dynamic_bitset支持与std::bitset相同的接口,但是它增加了一些针对运行时刻功能的函数以及std::bitset所没有的函数。通常情况下,当bitset的大小在编译时刻不能完全确定或者程序执行过程中可能会改变的时候,使用这个库作为std::bitset的替代。  Dynamic_bitset的作者是Jeremy Siek和Chuck Allison。  Boost.Graph  Graph是个处理图(graph)结构的库,它的设计在很大程度上受到STL的影响。它是通用以及高度可配置的,包括一些不同的数据结构:邻接表(adjacency lists),邻接矩阵(adjacency matrices),边线表(edge lists)。Graph库还提供了许多图算法,比如Dijsktra最短路径(Dijsktra's shortest path),Kruskal最小生成树(Kruskal's minimum spanning tree),拓扑排序等等,还有许多。  Graph的作者是Jeremy Siek, Lie-Quan Lee以及Andrew Lumsdaine。  Boost.Iterator  这个库为创建新的迭代器类型提供了一个框架,此外,它还提供了一些C++标准之外的有用的迭代器适配器。创建与标准兼容的迭代器类型通常是一件困难并且乏味的工作。Iterator库通过自动完成大多数细节部分的东西(比如提供标准所要求的typedefs)简化了上述工作。Iterator还使得适配一个现有的迭代器类型并且赋予它新的行为成为可能。比如,间接的迭代器适配器可以实施一个额外的去引用(dereferencing)操作,使得我们可以这么对待元素是指向某种类型的指针(或者智能指针)的容器,就好像容器所包含的元素就是那种类型的对象实体。  Iterator的作者是Jeremy Siek,David Abrahams,以及Thomas Witt。  Boost.MultiArray  MultiArray提供了一个多维容器,它在很大程度上类似于标准库容器而且相对于向量的向量(vectors of vectors)更加高效和直接。容器的维数是在声明的时候指定的,但是也支持切分和针对不同视图的投影,以及运行时刻的维数改变。  MultiArray的作者是。  Boost.Multi-index  Multi-index针对底层容器提供多个索引。也就是说,针对同一个底层容器你可以有不同的排序规则以及不同的存取语义。  当std::set和std::map不够用的时候可以使用Boost.Multi-index,通常这是为了高效的元素检索而需要维护多个索引情况。  Multi-index的作者是Joaqu&n M Lopez Muioz.  Boost.Range  这个库是一组针对ranges的概念和实用程序。直接使用ranges,而不是用代表ranges的一对迭代器来限定算法,这么做大大简化了算法的使用并且提高了用户代码的抽象级别。  Range的作者是Thorsten Ottosen。  Boost.Tuple  标准C++(通过使用类模板std::pair)已经包括了pairs,但是当前没有对n层垫片(n-tuples)的支持。Enter Tuple。与使用结构(structs)或者类定义n层垫片不同,类模板垫片直接支持把垫片定义为函数的返回类型或者参数,而且它还提供了存取垫片元素的泛型方法。关于这个库的更多详细信息请参见&Library 8: Tuple 8&。Tuple已经被即将到来的标准库技术报告所采纳。  Tuple的作者是Jaakko Jarvi。  Boost.Variant  Variant库包括一个通用的无差别的联合类(discriminated union class) ,这个类用于存储和操作来自于一组异构类型的对象。这个库的特性之一是,支持类型安全的访问,这消除了针对可变数据类型的类型转换代码的常见问题。  Variant的作者是Eric Friedman和Itay Maman。相似文章&今日推荐&&&&&&&&&&幽默笑话百态军事探索娱乐女性健康旅游互联网··············&数据结构,容器,迭代器,以及算法Boost.Any
Any库支持对任意类型的值进行类型安全的存取。当需要使用可变类型(variant type)的时候,有三种可能的解决方案:
无差别的(Indiscriminate)类型,比如void*. 这种解决方案几乎永远不可能达到类型安全,要尽可能地避免使用它。支持对一组类型进行存取的可变类型。可以进行转换的类型,比如在字符串类型和数字类型之间进行转换。Any实现的是第二种解决方案,基于值的(value-based)可变类型,而且支持任意多的类型。这个库经常被用于在标准库容器中存储异构类型(heterogeneous types)。更多信息请参考&Library 6: Any.&
Any的作者是Kevlin Henney。
Boost.Array
这个库是对C风格的数组的一个包装。可以把它们作为标准库容器的函数和类型定义(typedefs)的参数。从效果上看,这使得我们可以像对待标准库容器那样对待常规数组。这么做之所以有用是因为它在不影响效率的情况下增加了安全性,而且可以用统一的语法来处理标准库容器和常规数组。第二个理由意味着我们可以把常规数组应用于绝大多数需要对容器类型进行操作的函数。通常情况下,当运行效率要求最好使用常规数组而不是std:;vector的时候,考虑使用Array类。
Array的作者是Nicolai Josuttis。他借用Matt Austern和Bjarne Stroustrup的思想,构建了这个库。
pressed_pair
这个库由一个单独的参数化类型,compresed_pair组成,它非常类似于标准库的std::pair。与std::pair的不同之处在于,boost::compressed_pair会对模板参数进行判断,看看它们是否为空,如果有空参数,就使用针对空参数的优化方法对pair的大小(size)进行压缩。
当pair的模板参数类型可能为空的时候,使用pressed_pair来对pair进行存储。
Compressed_pair的作者是Steve Cleary,Beman Dawes,Howard Hinnant,以及John Maddock。
Boost.Dynamic_bitset
Dynamic_bitset库很大程度上类似于std::bitset,不同之处在于std::bistset把位数(也就是容器的大小)作为参数,而boost::dynamic_bitset支持运行时刻对容器大小进行调整。尽管dynamic_bitset支持与std::bitset相同的接口,但是它增加了一些针对运行时刻功能的函数以及std::bitset所没有的函数。通常情况下,当bitset的大小在编译时刻不能完全确定或者程序执行过程中可能会改变的时候,使用这个库作为std::bitset的替代。
Dynamic_bitset的作者是Jeremy Siek和Chuck Allison。
Boost.Graph
Graph是个处理图(graph)结构的库,它的设计在很大程度上受到STL的影响。它是通用以及高度可配置的,包括一些不同的数据结构:邻接表(adjacency lists),邻接矩阵(adjacency matrices),边线表(edge lists)。Graph库还提供了许多图算法,比如Dijsktra最短路径(Dijsktra's shortest path),Kruskal最小生成树(Kruskal's minimum spanning tree),拓扑排序等等,还有许多。
Graph的作者是Jeremy Siek, Lie-Quan Lee以及Andrew Lumsdaine。
Boost.Iterator
这个库为创建新的迭代器类型提供了一个框架,此外,它还提供了一些C++标准之外的有用的迭代器适配器。创建与标准兼容的迭代器类型通常是一件困难并且乏味的工作。Iterator库通过自动完成大多数细节部分的东西(比如提供标准所要求的typedefs)简化了上述工作。Iterator还使得适配一个现有的迭代器类型并且赋予它新的行为成为可能。比如,间接的迭代器适配器可以实施一个额外的去引用(dereferencing)操作,使得我们可以这么对待元素是指向某种类型的指针(或者智能指针)的容器,就好像容器所包含的元素就是那种类型的对象实体。
Iterator的作者是Jeremy Siek,David Abrahams,以及Thomas Witt。
Boost.MultiArray
MultiArray提供了一个多维容器,它在很大程度上类似于标准库容器而且相对于向量的向量(vectors of vectors)更加高效和直接。容器的维数是在声明的时候指定的,但是也支持切分和针对不同视图的投影,以及运行时刻的维数改变。
MultiArray的作者是。
Boost.Multi-index
Multi-index针对底层容器提供多个索引。也就是说,针对同一个底层容器你可以有不同的排序规则以及不同的存取语义。
当std::set和std::map不够用的时候可以使用Boost.Multi-index,通常这是为了高效的元素检索而需要维护多个索引情况。
Multi-index的作者是Joaqu&n M Lopez Muioz.
Boost.Range
这个库是一组针对ranges的概念和实用程序。直接使用ranges,而不是用代表ranges的一对迭代器来限定算法,这么做大大简化了算法的使用并且提高了用户代码的抽象级别。
Range的作者是Thorsten Ottosen。
Boost.Tuple
标准C++(通过使用类模板std::pair)已经包括了pairs,但是当前没有对n层垫片(n-tuples)的支持。Enter Tuple。与使用结构(structs)或者类定义n层垫片不同,类模板垫片直接支持把垫片定义为函数的返回类型或者参数,而且它还提供了存取垫片元素的泛型方法。关于这个库的更多详细信息请参见&Library 8: Tuple 8&。Tuple已经被即将到来的标准库技术报告所采纳。
Tuple的作者是Jaakko Jarvi。
Boost.Variant
Variant库包括一个通用的无差别的联合类(discriminated union class) ,这个类用于存储和操作来自于一组异构类型的对象。这个库的特性之一是,支持类型安全的访问,这消除了针对可变数据类型的类型转换代码的常见问题。
Variant的作者是Eric Friedman和Itay Maman。&&&&&  免责声明:本文仅代表作者个人观点,与王朝网络无关。王朝网络登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述,其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。&&&&&&为你推荐&&&&&&转载本文&UBB代码&HTML代码复制到剪贴板...&更多内容··········&&&&&&&频道精选&&王朝女性&&|&&|&&|&&|&&|&&|&&|&&|&&|&&|&&|&&|&王朝分栏&&|&&|&&|&&|&&|&&|&&|&&|&&|&&|&王朝编程&&|&&|&&|&&|&&|&&|&&|&&|&&|&&|&王朝导购&&|&&|&&|&&|&&|&&|&&|&&|&&|&&|&王朝其他&&|&&|&&|&&|&&|&&|&&&&2005-&&版权所有&

我要回帖

更多关于 不会改变吉他谱 的文章

 

随机推荐