V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
sgissb1
V2EX  ›  问与答

有没有 stl 或 c++各方言版本差异比较的资料可查

  •  
  •   sgissb1 · 2018-02-05 22:19:01 +08:00 · 1312 次点击
    这是一个创建于 2484 天前的主题,其中的信息可能已经有所发展或是发生改变。
    长期做 vs 下的 c++。对 gnu 平台和非 gnu 平台的 stl 不是很了解。最近在看一“大神”写的代码,这大神刚好把一个 map 的迭代器保存为类成员当作游标来用,当然这个类也会去 erase 和 insert。

    于是就回忆道,早在很早以前找工作,面试时遇到过一个大哥问过,迭代器是否可以作为某个类成员保存起来用。
    因为这个问题的比较泛,当时我也看过侯捷的 stl 书,我知道迭代器即便要当作游标来用,也要看情况的,如果容器一般是不行的( vector 为啥不行就不多说了,list 的话,vs2015 上试了一下不行),因为是线性表或类线性。关联器是可以的。

    具体原因我忘记的差不多了,隐约记得:
    容器的迭代表征的是一个具体的位置,关联器表征的是一个逻辑位置。具体的内容还在跟踪代码回忆中(反正 vs 里面的 stl 代码不是那么容易阅读的,看看也无妨)。


    有没有什么具体的资料和或者网站,可以快速查找,各方言版本的 stl 差异(说各个方言版本是指,各个厂商实现的 c++和 stl 都存在一些差异,有些比较细微)。
    8 条回复    2018-02-06 21:30:30 +08:00
    wevsty
        1
    wevsty  
       2018-02-05 22:43:54 +08:00
    如果想写出来的代码跨平台或者具有高度兼容性建议不要用任何不在标准里的方法(包括特性,依赖于实现过程的奇淫技巧)。
    有些坑只有你自己踩到才知道,依赖于没有规定实现过程的而又因为实现正好能使用的东西,也许下一个版本就全 over 了。

    逃~~~
    lifanxi
        2
    lifanxi  
       2018-02-05 22:53:17 +08:00
    研究差异意义不大,保证你自己只用标准上有的行为就行了。
    sgissb1
        3
    sgissb1  
    OP
       2018-02-06 10:04:57 +08:00
    @lifanxi
    @wevsty 小伙奇淫技巧知道什么样的人爱用吗?知道当初什么公司的大神电面我问的吗?
    lifanxi
        4
    lifanxi  
       2018-02-06 10:28:12 +08:00
    @sgissb1
    学东西不是为了面试。就你说的那个面试题,没问题。考的时你对这个东西的理解。如果他直接问你 GCC 4.3 跟 VS2015 的 STL 中对 iterator 的实现有什么差别,那就是他的不对了,除非你应聘的职位就是要做编译器或者相关的。

    不能因果倒置。要按标准来,理解形成标准背后的原理。可以结合具体的实现来理解,并且在这个过程中知道某个特定的实现中有什么“奇淫技巧”。而不是花时间专门去研究每个特定实现中有什么区别。
    sgissb1
        5
    sgissb1  
    OP
       2018-02-06 11:29:26 +08:00
    @lifanxi 哥们,不要一上来就讲道理,我并不是为了面试。我之所以提面试时有人问,是因为其他原因。有时候面试时,问问题也能够侧面提现者面试官的素质(心理素质和技能素质)。

    至于我为啥要问各方言版本的差异,你为啥不问问,一上来就讲道理呢?
    lifanxi
        6
    lifanxi  
       2018-02-06 13:02:48 +08:00
    @sgissb1 嗯,是我不对,不小心被带了节奏就陷进去了。那么你为什么需要了解各种方言的差异呢?
    gnaggnoyil
        7
    gnaggnoyil  
       2018-02-06 20:48:27 +08:00
    具体到 C++,奇技淫巧和是否符合标准之间没有必然关系,倒不如说不符合标准的奇技淫巧都不好意思说自己是奇技淫巧(逃

    具体到主贴这个例子,任何 STL 容器的 iterator 是否会被 invalidate 以及在何时会被 invalidate 作为 STL 接口的一部分都是被写在标准文档里的.所以这和各个实现的差异没有关系,毕竟敢于公开声明自己无视 ISO C++标准的实现到目前为止一个都没有——换句话说,C++各个实现中几乎没有形成符合大众认知的所谓"方言"的东西,根据各个实现公开的文档所描述的东西之间的差异大部分不超过对于 C++(不同版本)标准的实现的差异.而 C++标准及其各个版本的差异在 cppreference 里都可以按照词条查到——比如主贴所说的 iterator 问题.当然,早已向公众公开的 ISO C++标准草案(及其历史版本们)毫无疑问则是更权威的一个资料来源.

    当然不怕一万就怕万一.真的要折腾不同实现的差异的情况也不是没有.比如某些实现对于标准的支持程度就是呵呵,再比如需要折腾 impl-defined 或者一些编译器扩展.我接触过的编译器不多,碰到这种情况我通常会查阅各个编译器自己的文档.比如 msvc 就上 https://docs.microsoft.com/en-us/cpp/cpp/c-cpp-language-and-standard-libraries , GCC 就上 https://gcc.gnu.org/onlinedocs/ , Clang 就上 https://clang.llvm.org/docs/ ,无论是查标准支持差异,还是实现定义行为,或是对标准的扩展,都是可以轻松查到的.
    sgissb1
        8
    sgissb1  
    OP
       2018-02-06 21:30:30 +08:00
    @gnaggnoyil 非常感谢认真回复和后续提供的资料查询链接。

    要是怕踩到坑,尤其是有些开源代码很喜欢写带 gnu 扩展的方言代码。比如老版本的 vs 在 c++方言上的处理也存在差异。
    一个是拿来汇集整理资料,后续踩到坑好查,c++iso 标准那坨玩意太厚了,看得想睡觉,所以想找快查表。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5553 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 08:30 · PVG 16:30 · LAX 00:30 · JFK 03:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.