1. 程式人生 > >C++ STL map 下標操作注意事項

C++ STL map 下標操作注意事項

今天的程式出了一個Bug,查到的原因是使用map下標操作的問題,在這裡轉一個作為備忘

一個map就是一個key、value對偶的序列,它提供基於key的快速提取操作。也就是說,可以用下標運算子[]將key作為下標去執行查詢並返回相應的值。因此可以把map的使用方法想象成有特殊下標的陣列。在很多時候用下標運算子[]對map中的元素進行存取是非常方便和簡單;但是如果map下標運算子[]運用不得當,也會造成意想不到的問題。

我們知道,C++是吧檢查下標越界的。用超出陣列下標範圍的下標去訪問陣列元素的錯誤會在執行期出現,很有可能將程式搞崩潰。對於map而言,也沒有類似的下標越界概念,但是卻又作為下標的key在map中不存在的現象。在這種情況下,如果運用不當,就造成意想不到的問題,而這種問題是屬於比較隱蔽的問題。如果對map的下標運算子[]不是非常瞭解,將很難發生問題所在。

比如說有下面的程式碼片段:

//定義一個map</span>
map<string, string> mapTelDir;

//用[]操作符可以方便快速的給map新增內容
mapTelDir["StarLee"] = "13813131313";

//修改關鍵碼為LiXing的值
//注意,這裡的關鍵碼在map裡面並不存在
if(mapTelDir["LiXing"] == "13913131313")
{
    mapTelDir["LiXing"] = "13513131313";
}

//輸出
cout<<"The cellhone number of LiXing is: " << mapTelDir["LiXing"] << endl;

上面的程式碼看起來似乎沒有任何問題,但是最後一行輸出的手機號碼卻永遠為空!原因就是在判斷語句裡面對map下標運算子[]的錯誤使用。

map的下標運算子[]的作用是:將key作為下標去執行查詢,並返回相應的值;如果不存在這個key,就將一個具有該key和value的某人值插入這個map。

對於上面的程式碼來說,if (mapTelDir["LiXing"] == "13913131313"),這行程式碼首先去查詢map中是否有key為LiXing的項,結果沒有發現該項,於是就向map中插入一項<"LiXing", "">(string的預設值為空字串)。這就造成if語句的判斷結果永遠為false,那樣就不可能修改key為LiXing的值。

為了更好的說明這個問題,可以看一下map下標運算子[]實現的程式碼:

// 下面的程式碼摘自VS2005中的..vcincludemap
mapped_type& operator[](const key_type& _Keyval)
    {    // find element matching _Keyval or insert with default mapped
        iterator _Where = this->lower_bound(_Keyval);
        if (_Where == this->end()
            || this->comp(_Keyval, this->_Key(_Where._Mynode())))
            _Where = this->insert(_Where,
                value_type(_Keyval, mapped_type()));
    return ((*_Where).second);
    }
map的下標操作符[]使用上面的方法定義,使向map裡插入值和使用key來訪問相應的value變得非常方便而快速。雖然在使用的時候會出現有人寫出類似上面那麼遠的錯誤程式碼,但是這是程式設計師的錯誤,因為寫出正確的程式碼是程式設計師的責任。這樣做很符合C++的風格:非常靈活,但要小心使用。

相關推薦

C++ STL map 操作注意事項

今天的程式出了一個Bug,查到的原因是使用map下標操作的問題,在這裡轉一個作為備忘 一個map就是一個key、value對偶的序列,它提供基於key的快速提取操作。也就是說,可以用下標運算子[]將key作為下標去執行查詢並返回相應的值。因此可以把map的使用方法想象成有

C++ STL map 刪除一個元素 erase() 操作

std::map<int,int>::iterator iter=m_intmap.begin(); for (iter;iter!=m_intmap.end();) { if (iter->first==1) { m_cintmap.

C++ STL map 刪除一個元素 erase 操作

                 std::map<int,int>::iterator iter=m_in

KEIL MDK 為單一C檔案生成.LIB檔案以及注意事項

操作步驟: 1、右鍵點選工程,假設為a,選Add Group,假設為b,再將想生成lib的檔案加入b group,假設檔案是cc.c,必須要有cc.h。 2、右鍵依次點選其他的group,按KEIL官網資料所說的,將Options for Group->Prope

C++ STL map詳解

索引 turn clas c++ ltr 能力 code 宋體 快速 一.解釋: p { margin-bottom: 0.25cm; direction: ltr; color: #00000a; line-height: 120%; text-align: justif

C++ STL map

fin ring 快速 struct ever 區間 二叉樹 tps 們的 之前寫過一篇關於map容器的一篇博客,但是只有一些基礎操作,後來我在CSDN上看到了一位大佬寫的博客於是轉載過來了。 作者大大的博客https://blog.csdn.net/sunshinewa

c語言定義指標型別需注意事項

1)在定義說明語句中,指標變數名之前的星號“*“是指標變數的修飾符,也就是說它所修飾的變數是指標變數。 2)指標變數是用它們所指向的物件型別來區分的。如定義 int *ip,型別int並不是指標的型別,而是指標所指向變數的型別。 3)儘管各種指標變數所儲存的是記憶體中的地址,但不同型別的指標是不能互換或者

Git-Windows64位,新手實用操作注意事項

1、重新開啟Git操作以前的檔案 和之前建立庫一樣,先用git config命令指定你要操作的庫(這個庫裡面有屬於你自己需要操控的檔案),就是你退出微信後要重新登入一樣的道理。如果你有想看哪個微信的訊息就登入哪個,輸入使用者名稱和密碼。Git裡面想操作哪個庫也一樣,要對應輸入使用者名稱(就是na

C# socket伺服器非同步監聽注意事項

private static int port = Convert.ToInt32(ConfigurationManager.AppSettings["LogServerPort"]); public static void StartListening()

有關mycat一些操作注意事項,自己慢慢記錄

關於查詢操作 報錯com.alibaba.druid.sql.parser.ParserException: ERROR. token : FROM, pos : 14 在mycat進行查詢的時候,不可以用* 進行查詢,必須新增欄位名進行查詢,否則會 報錯 com.a

log4net在windows 2003 iis6使用的注意事項

1、log4net 2.08 在windows 2003 IIS6 下使用時,無法將日誌記錄到資料庫,但可以記錄到檔案,最終確認net4.0版的log4net.dll編譯有問題,可能對net4.5有依賴,不能在windows2003上使用,解決方法很簡單,直接使用net2.0版本就可以了。 2、如果檔案型日

C++ STL: map的按key和按value排序

本文目錄 1. map定義 在將map的排序之前,我們要知道它是STL裡的一個模板類,用來存放<key, value>鍵值對的資料結構,定義如下。 template < class Key,

微信支付相關操作注意事項

注意項: 1、不能完全相信微信官網釋出的DEMO,其中有問題。 2、微信支付配置項是先後順序,千萬注意(猜想微信會快取之前的配置,你是查不出原因來的) 3、配置順序為:各個設定項,百度一堆,自行查詢,這裡只提出注意點和事項。 一、配置公總號獲取使用者資訊介面,安全域名

c++中結構體位域使用注意事項

1、一個位域必須儲存在同一個單元中,不能跨兩個單元。如一個單元所剩空間不夠存放另一位域時,應從下一單元起存放該位域。如下 第一個unsigned short 中 沒有足夠的空間儲存system_clo

c++STL map用法(轉)

此文章源於博主(sunshinewave),轉到自己部落格以後方便檢視 map是STL的一個關聯容器,它提供一對一(其中第一個可以稱為關鍵字,每個關鍵字只能在map中出現一次,第二個可能稱為該關鍵字的值)的資料處理能力,由於這個特性,它完成有可能在我們處理一對一

C++ STL map容器的排序(按key或value)

template < class Key, // map::key_type class T,

C++ STL map的使用和效能分析

1、map簡介 map是一類關聯式容器。它的特點是增加和刪除節點對迭代器的影響很小,除了那個操 作節點,對其他的節點都沒有什麼影響。對於迭代器來說,可以修改實值,而不能修改key。 2、map的功能 自動建立Key - value的對應。key 和 value可以是任意你需要的型別。 根據key值快速

Linux/CentOS 升級C基本執行庫CLIBC的注意事項(當想解決GLIBC_2.x找不到的編譯問題)

在你準備升級GLIBC庫之前,你要好好思考一下, 你真的要升級GLIBC麼? 你知道你自己在做什麼麼? glibc是gnu釋出的libc庫,即c執行庫。glibc是linux系統中最底層的api,幾乎其它任何執行庫都會依賴於glibc。glibc除了封裝linux作業系

Windows環境部署TestLink注意事項

我使用的是testlink-1.9.16,下載後解壓備用 執行TestLink的前提條件是安裝了apache、mysql、php等軟體,可以分別安裝也可以使用EasyPHP整合安裝。 下載EasyPHP地址:官網 http://www.easyphp.o

c++ STL map常見用法

#include<iostream> #include<string> #include<map> using namespace std; int main(){ //定義 map<int, string> map1