六月婷婷综合激情-六月婷婷综合-六月婷婷在线观看-六月婷婷在线-亚洲黄色在线网站-亚洲黄色在线观看网站

明輝手游網中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

在STL容器中使用范圍檢查

[摘要]訪問內建數組的元素是一種速度非常快的操作,因為 C++ 在運行時期不執行范圍檢查。但是,這樣做的后果是,一個不小心的語句會把程序帶入一個未定義的狀態,例如: char s[10]; void func(char * str) s[12]='\0'; //...

    訪問內建數組的元素是一種速度非常快的操作,因為 C++ 在運行時期不執行范圍檢查。但是,這樣做的后果是,一個不小心的語句會把程序帶入一個未定義的狀態,例如:

    char s[10];
    void func(char * str)
    {
     s[12]='\0'; //undefined; writing past a buffer's end
    }

    一些程序員錯誤地認為 STL 容器,比如 std::vector 和 std::string 等,除了其它優點之外還實現了自動的范圍檢查。事實上,情況并非如此。在使用重載的 [] 操作符訪問一個 vector 的元素時,事實上并沒有執行范圍檢查。同樣對其它序列容器,情況也是如此,這樣的容器有 std::string 和 std::dequeue 等。

    范圍檢查會帶來可觀的空間開銷和運行時間開銷。強加這種開銷給用戶將會使得這些容器顯著地變慢,因此變得用處不大。相反,C++ 堅持“相信程序員”的風格。注意,范圍檢查在很多情況下是沒有必要的。

    std::vector<int> vi;
    //..fill the vector
    for (int n=0; n<vi.size(); n++)
    {
     std::cout<<vi[n]<<std::endl; //n is always valid
    }

    重載的 [] 操作符是一個成熟的功能。其實現的效率非常高,并且其調用通常是內聯的(inline)。這樣,它幾乎提供了與其它相應內建操作相同的速度。

    什么時候范圍檢查是不同避免的

    只有很少的情況下范圍檢查才是不可避免的。在這些情況下,STL 容器提供一個更加安全(但是速度也更慢)的方法來訪問元素,即 at() 成員函數。at() 在功能上與重載的 [] 操作符很相似,但是它執行范圍檢查。如果參數是無效的,at() 就拋出一個 std::out_of_range 異常。因此,我們應該總是將 at() 調用包圍在一個 try 代碼塊中,并提供一個與之匹配的 catch() 子句:

    void assign(std::string & s, int index, char val)
    {
     try
     {
      s.at(index)=val;
     }
     catch (std::out_of_range & exc)
     {
      std::cerr <<exc.what();
     }
    }

    總之,使用 [] 操作符訪問容器元素的效率是很高的,如果范圍檢查不可避免,那么可以使用 at() 替代操作符 []。記住,在這種情況下一定要把對 at() 函數的調用包圍在一個 try 代碼塊中并提供一個匹配的 catch() 子句。




主站蜘蛛池模板: 日韩av.com| 任我爽精品视频在线播放 | 伊人久久大香网 | 天天干天天看 | 手机午夜视频 | 天天干2018 | 伊人精品在线观看 | 色老头久久久久久久久久 | 欧美怡红院免费的全部视频 | 最好韩国日本高清 | 亚洲国产精品线播放 | 午夜在线影院 | 日韩最新中文字幕 | 亚洲宅男天堂a在线 | 小说区 亚洲 自拍 另类 | 一区二区三区网站在线免费线观看 | 亚洲激情在线看 | 五月花综合网 | 午夜影视在线观看免费完整高清大全 | 最新韩国伦理片大全手机在线播放 | 欧美一级精品 | 午夜在线观看免费 | 日韩第二页 | 日韩中文字幕精品视频在线 | 午夜成人免费影院 | 天堂中文网 | 欧美一级手机免费观看片 | 日本成人一区二区三区 | 日韩伦理一区 | 午夜在线不卡 | 午夜丁香影院 | 亚洲国产香蕉视频欧美 | 亚洲天堂免费在线视频 | 日本视频免费在线 | 又大又硬又爽又粗又快的视频免费 | 四虎影院在线免费播放 | 亚洲综合色网站 | 日韩成人免费在线 | 色综合久久综合网欧美综合网 | 天天玩夜夜操 | 日日日日人人人夜夜夜2017 |