zoukankan      html  css  js  c++  java
  • STL容器之vector 的下标越界是否报错

    今天将程序在VS2015和g++ 5.4.0下运行,发现vector越界 VS会报错,而g++正常输出。故而查看了源码,看个究竟。

    例:

    #include <iostream>
    #include <vector>
    using namespace std;
    int main()
    {
           vector <int> a;
           a.push_back(66);
           a.push_back(88);
           
           cout << a[0] << endl;
           cout << a[1] << endl;
           cout << a[2] << endl; //发生越界。
           
           return 0;
    }

    输出:

    VS2015下:


    g++ 5.4.0下:


    分析:

    VS2015的vector实现:


    g++ 5.4.0的vector实现:

    我还查看了侯捷老师的<<STL源码剖析>>的早期SGI STL实现:


    可见:P.J.Plauger版本(VS用的是PJ版本的STL)STL对STL下标有越界检查,而SGI STL的vector没有对下标做检查。

    补充:

    #include <iostream>
    #include <vector>
    using namespace std;
    int main()
    {
           vector <int> a;
           a.push_back(66);
           a.push_back(88);
           
           cout << a[0] << endl;
           cout << a[1] << endl;      
           cout << *(a.begin() + 2) << endl; //发生越界,VS报错,g++正常输出。
           cout << a.at(2) << endl; //发生越界,VS和g++都会报错。
                 
           return 0;
    }
    
    同理,*(a.begin() + 2) 也是VS STL做了越界检查而g++ STL没有检查。但a.at(2)无论是VS还是g++都会报错,即都对数组越界做了检查,故推荐最好用这种方式。


  • 相关阅读:
    循环
    list和tuple
    Python字符串和编码注意点
    【转载】国内安卓推送的希望
    【转载】Android属性动画和视图动画的区别
    【转载】Android 属性动画详解
    【转载】 android 属性动画详解
    java8 新特性学习详细篇2
    java8 新特性详细篇
    JAVA8十大新特性
  • 原文地址:https://www.cnblogs.com/a3192048/p/12241331.html
Copyright © 2011-2022 走看看