VC stl map 查找查找key的问题

& & & 先问个问题吧,map中的key可以相同吗?如果相同,程序会咋样呢?
#pragma warning(disable : 4786) //VC++6.0对map的支持不好,所以要把这个东东放在最前面,否则警告一大堆
#include &map&
#include &string&
#include &iostream&
typedef map&int, int& MyM
int main()
m.insert(make_pair&int, int&(1, 3));
m.insert(make_pair&int, int&(0, 4));
m.insert(make_pair&int, int&(0, 2));
for(it = m.begin(); it != m.end(); it++)
cout && it-&first && &---&&&& it-&second &&
}& & & 结果为:
& & & 可见,key值相同是没有意义的。那value值可以相同吗?可以的,且看:
#pragma warning(disable : 4786) //VC++6.0对map的支持不好,所以要把这个东东放在最前面,否则警告一大堆
#include &map&
#include &string&
#include &iostream&
typedef map&int, int& MyM
int main()
m.insert(make_pair&int, int&(1, 3));
m.insert(make_pair&int, int&(2, 3));
m.insert(make_pair&int, int&(0, 3));
for(it = m.begin(); it != m.end(); it++)
cout && it-&first && &---&&&& it-&second &&
& & & & 结果为:
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:548102次
积分:14442
积分:14442
排名:第311名
原创:923篇
转载:48篇
评论:367条
(18)(51)(52)(35)(20)(53)(41)(35)(13)(32)(36)(7)(1)(47)(23)(26)(4)(13)(4)(19)(72)(13)(2)(14)(45)(32)(7)(3)(28)(53)(106)(68)汇聚2000万达人的兴趣社区下载即送20张免费照片冲印
扫码下载App
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
阅读(1269)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_094070',
blogTitle:'STL
blogAbstract:'由于STL是一个统一的整体,map的很多用法都和STL中其它的东西结合在一起;map中由于它内部有序,由红黑树保证,因此很多函数执行的时间复杂度都是log2N的,如果用map函数可以实现的功能,而STL Algorithm也可以完成该功能,建议用map自带函数,效率高一些\r\n&\r\nMap是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它完成有可能在我们处理一对一数据的时候,在编程上提供快速通道。这里说下map内部数据的组织,map内部自建一颗红黑树(一种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,所以在map内部所有的数据都是有序的,后边我们会见识到有序的好处。\r\n下面举例说明什么是一对一的数据映射。比如一个班',
blogTag:'',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:0,
publishTime:9,
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:'',
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}当前访客身份:游客 [
当前位置:
速度完胜STL,不过不排除我测试代码带有偏向性,对随机82000词库测试结果。
共有35个答案
<span class="a_vote_num" id="a_vote_num_
再怎么测试 我也会用stl的,除非性能实在重要的不能再重要了才可能自己去设计数据结构和算法,目前我所有的项目中stl的性能完全胜任。
<span class="a_vote_num" id="a_vote_num_
,目前来看,说你的map比std::map慢还为时太早,发现你使用std::map的时候,使用的是std::string,但是使用你自己的map的时候(估计使用的是你写的string),从gprof性能分析方面来看,你写的string在比较方面实在慢的可以。严重拖慢了程序。污染实验结果,@helloworld_go说你使用了内存池,但是std::map和std::string都没有使用内存池,这也会污染实验结果,本着严谨治学的态度,最好还是给std::map加上内存池,对你自己的map使用std::string。比较才能有效。这贴正好应了那句话,程序的瓶颈往往出现在意想不到的地方,在优化前最好还是性能分析一下。你改好测试程序的时候在发过另外一个帖子看看吧。由于对程序结果的污染严重,这个帖子在我看来已经没有讨论的必要了。这就是我对这个帖子的最后总结。
--- 共有 9 条评论 ---
: 呵呵呵,加油,努力。写好后在讨论吧,希望不要再污染程序结果就行了
(3年前)&nbsp&
: 现在我打算参照STL的实现方式,将内存池去掉,在alloc里面实现内存池。这样做这种比较测试时,写测试代码容易
(3年前)&nbsp&
: 在多个这种小数据结构(指的是二叉树的节点)对象的情况下,内存池的优化绝对可以覆盖掉你所有虚函数的开销。如今,你使用了内存池,但是效率还是比不上std::map。所以可以下结论,你把所有的虚函数全部去掉,就算将这些全部改为内联内联,然后去除掉你的内存池,你的map还是比不上std::map。
(3年前)&nbsp&
: 无法对算法进行分析,不过我觉得肯定是比不上hash的。在我的测试数据中,你的map插入和删除时速度大概比std::map差不多慢1.00多(忘记了你用的单位是什么),但是char的比较只耗费了0.08(假设和你的单位一样),那么你的时间减去char比较的时间还是比不上std::map,不过从查找时间来看,你的数据结构比起二叉树来还是有优势的。
(3年前)&nbsp&
: 本来这种数据结构实现起来就比较复杂,里面应该除了虚函数外还其他很多东西还能优化,二叉树跟二叉树比应该有可比性,还有我的字符串只是个char*+int 的结构体,虚函数是一个比较类实现,这样比较的花样能比运算符重载多,下个版本会直接通过模板实现+内联应该省掉不少时间,而且我的内存池其实也很多虚函数,优化程度不够,内存池一般来说只对插入能有不少的性能提升而已。
(3年前)&nbsp&
<span class="a_vote_num" id="a_vote_num_
闲着无聊,使用gprof测试了一下楼主的程序,看到一个结果大吃一惊。发现billzheng已经发出抱怨了,我还是忍不住想说说,最消耗时间的是一个虚函数(这点没有问题),而这个虚函数的功能居然是比较char的大小(这个就郁闷了)。
建议楼主最好连自己写的string也换成std::string,把,虽然我对std::string没有什么好感。
--- 共有 4 条评论 ---
: MinGW,CUI风格的。不过我还是很喜欢这个工具的。回到这个问题,现在我觉得我的那句抱怨要改成,最花费时间的是比较char(毕竟是字符串嘛),但是比较char居然是一个函数,不仅这个函数没有内联,还是一个虚函数。
(3年前)&nbsp&
: 没用过这个性能测试工具,在哪里下,给个链接哥去下个
(3年前)&nbsp&
: good one
(3年前)&nbsp&
忘了说,是g++4.6.2,优化级别O2,因为不优化(说实话)没有什么可比性)。
(3年前)&nbsp&
<span class="a_vote_num" id="a_vote_num_
我使用了几个编译器编译了一下,楼主的优势还是有的,在gcc 4.6.2中,楼主的查找时间比较少(测试了很多次),在msvc10.0中,楼主的查找时间只长一点点(测试了很多次),但是在msvc9.0上,出现了死循环。
这是gcc 4.6.2的测试结果
msvc10.0的测试结果
msvc9.0(VS2008)中无法运行出结果(估计是死循环),可能楼主要在这方面花点时间。
另外,我觉得unorder这类的就不用测试了,毕竟数据结构不同,效率有差异是肯定的,不是library的原因,不是程序员的原因,是上帝的原因。还是很佩服楼主的。
代码我没看(实在看不下去)。
楼主说要优化到和STL一样(C++初学者的豪言壮语),建议楼主还是算了吧。深入了解后就会放弃了。
--- 共有 9 条评论 ---
: 证明MS对C++不上心呀,STLport都那么多年了(虽然最近在用C++11重写),原以为VC2010可以赶上STLport。唉
(3年前)&nbsp&
(3年前)&nbsp&
: Alan Ning做的第二次STL 性能测试比较: //stl-performance-comparison-round-2-vc9-vc10-stlport/
(3年前)&nbsp&
: gcc 4.6.2使用的也是SGI STL的“山寨”版,所以STLport速度是不是比VC2010的快,这还是比较难说的(VC2010 STL的质量应该还是不错的),可惜VS2008测试不了,如果测试得了,估计STLport会比VS2008要快。懒得去配置STLport。
(3年前)&nbsp&
赞一个, 有一个兄弟深入测试。 比起VS STL用STLport可能会更快一点。
(3年前)&nbsp&
<span class="a_vote_num" id="a_vote_num_
引用来自“billzheng”的答案
@cut看看你的代码,基本C++知识都没有,你玩什么啊? 还有,每个函数都是需要C基础来写的,你觉得呢?
template &class className&
PeckerInterface PeckerCompare : public virtual PeckerObject
virtual ~PeckerCompare()
virtual COMPARE_RESULT Equals(const className P_REF objectA,const className P_REF objectB)
if (objectA & objectB)
return GREATER;
else if (objectA & objectB)
return LESSER;
return EQUALS;
// vc compiler error C1202: recursive type or function dependency context too complex
// gcc ok!
//static PeckerCompare&PeckerCompare& PeckerCompareD
你说要PP才能提升,我倒觉得谦虚一点,多交几个朋友,快乐学习什么都好。如果整天有人和你纠缠才叫脑残,你自己玩去吧。测试也测试了,鉴定也鉴定了,你还不知道自己的水平。
这段代码贴出来,我们就和你PP, 会C++不要回答,看@cut怎么学会。
说到底,一句话,C你们会我们也会,C++/Boost/STL我们会,你们不会。你们喷是因为你们学不好,学不会。
好嘛,哥水平不行,哥认了行不。哥承认这段代码是参照了一些C#的写法,这样做比较是一个肥猪流的C++做法,而且在哥数据结构中插入删除搜索中频繁使用,性能会大减。还有PeckerInterface,P_REF 这些有人说很难看之类的。
不过经你们昨天的喷哥已经知道改进方向了,这个东西下个版本会用traits替代或者使用直接c++运算符重载替代。你们说的STL,BOOST哥会仔细重新研究下它们的代码。前段时间又不得不喷下你们,因为哥这份代码贴出来将近一个月才那么点访问量,没有人关注没人喷,纠结牛B还是SB哥不知道。不过这次感谢你们帮哥测试,鉴定,并对前段时间恶意喷你们道歉,等下个版本出来后再来好好喷喷哥。
--- 共有 1 条评论 ---
不错,鼓励一下。
(3年前)&nbsp&
<span class="a_vote_num" id="a_vote_num_
引用来自“billzheng”的答案
引用来自“宏哥”的答案
引用来自“billzheng”的答案
@宏哥你喷所有的语言,恨不得全世界都不要学C++/STL/Boost/Java,大家都学C跟你去工厂调试板子。然后你没有很高的C能力教大家的。
从Osc的角度,你可以喷走20%或者跟多的C++学习者,对于他们勤奋为大家服务的网站也是损失。&
从那些学生和刚工作的人来说,你误导他们为了的道路,光学C做小软件,道路在那里? 你除了喷,没有真正教会别人什么东西,这是我要跟你学习STL/BOOST/ALGORITHM的原因。做技术的,态度很重要,说一个工具,一门语言不好是要深入然后说出理由来的。&
P K 不了shmobjqueuenew.h 就好消停了.
既然是你自己的代码,你理解自己代码在做什么吧? 跑一跑给我们讲讲性能? 大数据/小数据进行测试? 进行插入,删除,遍历,排序,测试?说的出来自己程序的性能么? 还是要完全拜倒在某个C函数的性能下?,然后眼睛一闭哥天下第一,到底还是说不出自己代码的性能,因为不知道。然后追着别人,你得给我测测....
C 做小软件? Oralce, windows?
做板子? 我现在用php 和python.&
工作也不做编程.
扯淡了吧. 我已经不想骂你了.
到目前为止
我没有喷错过.&
仅此而已.&
--- 共有 5 条评论 ---
我当然知道,对你来说一样. 时间会检验.
(3年前)&nbsp&
: 结论是别人下的,不是你自己下的。
(3年前)&nbsp&
"我没有喷错过."
(3年前)&nbsp&
而我们的意思是C要学,C++,Java,C#都要学。你说你没有喷,看看你的历史记录....
(3年前)&nbsp&
你把这段代码叫做STL,让STL和STL算法怎么活? 你能带领大家学习C,仅C而已,然后就有机会开发oracle,windows,linux了?
(3年前)&nbsp&
<span class="a_vote_num" id="a_vote_num_
引用来自“宏哥”的答案
引用来自“billzheng”的答案
@宏哥你喷所有的语言,恨不得全世界都不要学C++/STL/Boost/Java,大家都学C跟你去工厂调试板子。然后你没有很高的C能力教大家的。
从Osc的角度,你可以喷走20%或者跟多的C++学习者,对于他们勤奋为大家服务的网站也是损失。&
从那些学生和刚工作的人来说,你误导他们为了的道路,光学C做小软件,道路在那里? 你除了喷,没有真正教会别人什么东西,这是我要跟你学习STL/BOOST/ALGORITHM的原因。做技术的,态度很重要,说一个工具,一门语言不好是要深入然后说出理由来的。&
P K 不了shmobjqueuenew.h 就好消停了.
既然是你自己的代码,你理解自己代码在做什么吧? 跑一跑给我们讲讲性能? 大数据/小数据进行测试? 进行插入,删除,遍历,排序,测试?说的出来自己程序的性能么? 还是要完全拜倒在某个C函数的性能下?,然后眼睛一闭哥天下第一,到底还是说不出自己代码的性能,因为不知道。然后追着别人,你得给我测测....
<span class="a_vote_num" id="a_vote_num_
引用来自“billzheng”的答案@宏哥你喷所有的语言,恨不得全世界都不要学C++/STL/Boost/Java,大家都学C跟你去工厂调试板子。然后你没有很高的C能力教大家的。
从Osc的角度,你可以喷走20%或者跟多的C++学习者,对于他们勤奋为大家服务的网站也是损失。&
从那些学生和刚工作的人来说,你误导他们为了的道路,光学C做小软件,道路在那里? 你除了喷,没有真正教会别人什么东西,这是我要跟你学习STL/BOOST/ALGORITHM的原因。做技术的,态度很重要,说一个工具,一门语言不好是要深入然后说出理由来的。&
P K 不了shmobjqueuenew.h 就好消停了.
--- 共有 2 条评论 ---
你的get/put无非2个memcpy 和几个指针移动,你到底想测试什么? 一眼就看明白的代码,你要PK什么? 我测试了,你信么,你都无法重现?
(3年前)&nbsp&
我在这个论坛就整天见你喷这个,喷那个,懂的又不多,自己的本门语言学不好。你要赢,我可以让你赢啊,我可以认输啊。
(3年前)&nbsp&
<span class="a_vote_num" id="a_vote_num_
@宏哥你喷所有的语言,恨不得全世界都不要学C++/STL/Boost/Java,大家都学C跟你去工厂调试板子。然后你没有很高的C能力教大家的。
从Osc的角度,你可以喷走20%或者跟多的C++学习者,对于他们勤奋为大家服务的网站也是损失。&
从那些学生和刚工作的人来说,你误导他们为了的道路,光学C做小软件,道路在那里? 你除了喷,没有真正教会别人什么东西,这是我要跟你学习STL/BOOST/ALGORITHM的原因。做技术的,态度很重要,说一个工具,一门语言不好是要深入然后说出理由来的。&
<span class="a_vote_num" id="a_vote_num_
引用来自“billzheng”的答案
引用来自“宏哥”的答案
引用来自“billzheng”的答案
@cut看看你的代码,基本C++知识都没有,你玩什么啊? 还有,每个函数都是需要C基础来写的,你觉得呢?
template &class className&
PeckerInterface PeckerCompare : public virtual PeckerObject
virtual ~PeckerCompare()
virtual COMPARE_RESULT Equals(const className P_REF objectA,const className P_REF objectB)
if (objectA & objectB)
return GREATER;
else if (objectA & objectB)
return LESSER;
return EQUALS;
// vc compiler error C1202: recursive type or function dependency context too complex
// gcc ok!
//static PeckerCompare&PeckerCompare& PeckerCompareD
你说要PP才能提升,我倒觉得谦虚一点,多交几个朋友,快乐学习什么都好。如果整天有人和你纠缠才叫脑残,你自己玩去吧。测试也测试了,鉴定也鉴定了,你还不知道自己的水平。
这段代码贴出来,我们就和你PP, 会C++不要回答,看@cut怎么学会。
说到底,一句话,C你们会我们也会,C++/Boost/STL我们会,你们不会。你们喷是因为你们学不好,学不会。
说了这么多,
有本事写一个代码测试我的shmobjqueuenew.h 和 Boost的共享内存Queue对比
Boost我不会, 你会.
连 shmobjqueuenew.h 的测试代码我都给了.
要稍微修改一下.
STL没有对应功能, 只能F K Boost.
对应的 Boost在这里
我不认为你能很快实现FIFO.
从你各种说我看不懂你的C代码,到我请人来围观你的C代码和水平。现在你开始解释是当年毕业时候的第一个作品,你的C语言水平不高,2年前的C代码水平也不高。你玩什么嘛?&
在我所有的发言当中, 我都没有说过自己C水平高,C只是在不得已情况才使用.
但是 F K STL, Boost足够
你也承认 Boost不可能比shmobjqueuenew.h快. shmobjqueuenew.h 直接进行原子操作,
没有任何方法比它更快.
我一直说明的就是STL, Boost是非常烂的东西.
那个很幼稚的东西, 实现的是内部数据路由, 是通用的 大规模事务交易算法.
在这个幼稚的东西上,构建了整个 金融产品线.
关键不是内部代码漂亮, 而是在于接口设计, 而且经过严格测试以及生产的考验.
我一开始就说这是非常幼稚的代码.
有什么技术问题吗?
cut的其他问题
类似的话题当前位置: >
> 关于 STL的map的find方法为什么找不到确又追加不进去,该怎么处理
关于 STL的map的find方法为什么找不到确又追加不进去,该怎么处理
ncqingchuan & at
关于 STL的map的find方法为什么找不到确又追加不进去typedef & struct & _gpc_vertex &
& /* & Polygon & vertex & structure &
& double &
& /* & Vertex & x & component &
& double &
& /* & vertex & y & component &
& bool & operator &
& & (const &
& _gpc_vertex & &p2) & const
& if & (fabs(x-p2.x & ) &
& & 0.001 & && & fabs(y & - & p2.y & ) &
& & 0.001)
& return &
& if & (x &
& return &
& if & (fabs(x & - & p2.x) &
& & 0.001)
& return & y &
& return &
gpc_vertex &
vert.x & = & pt.x;
vert.y & = & pt.y;
std::map &gpc_vertex, & LPstruPolygonVert& ::iterator & iter & = &
& m_mapPoints.find(vert);
LPstruPolygonVert & pVert & = & NULL;
if & (iter & == & m_mapPoints.end())
if & (FindPoint(pt))
AcDbObjectId &
CreateCircle(pt,3.0,6,idd);
ads_point &
acedGetPoint(NULL, &\n出现矛盾了。。这个找到了 &,pp);
pVert & = & new & struPolygonVert();
pVert-& pt & = &
m_Verts.Add(pVert);
std::pair &std::map &gpc_vertex, & LPstruPolygonVert& ::iterator,bool&
pSuc & = &
& m_mapPoints.insert(std::pair &gpc_vertex, & LPstruPolygonVert& (vert,pVert));
if & (pSuc.second & == & false)
AcDbObjectId &
CreateCircle(pt,2.0,5,idd);
ads_point &
acedGetPoint(NULL, &\n出现错误了,没有找到也加不进去。。 &,pp);
m_Verts.GetSize();
return & pV
pVert & = & iter-&
return & pV
operator &逻辑有问题,比如 a(1,2) 和 b(1.0001,1) 相比较,a &b,同时 b &a。
看出来了吧
ncsofe & &
& & (0)(0)#include &iostream&
#include &map&
#include &iterator&
struct My_Point
My_Point(const int &_x=0,const int &_y=0):x(_x),y(_y){}ncsehhs & &
& & (0)(0)
本问题标题:
本问题地址:
温馨提示:本问题已经关闭,不能解答。
暂无合适的专家
&&&&&&&&&&&&&&&
希赛网 版权所有 & &&&&湘教QS2-164&&增值电信业务经营许可证湘B2-

我要回帖

更多关于 stl map insert 的文章

 

随机推荐