2013-07-30 197 views
3

我在初始化映射時遇到問題。我們的目標是使用包含所有鍵.e.g「鍵1鍵2 KEY3」在地圖初始化for循環中的映射

map<const char *, int, ltstr > mymap; 
string fortest="a b c"; 
istringstream iss(fortest); 
string field; 
//cout<<"transaction name:"<<transactionName<<'\n'; 
//cout<<"transaction fields:"<<'\n'; 
while(iss>>field) 
{ 
    mymap[&field[0]]=0; 
    cout<<"field name:"<<field<<'\n'; 
    cout<<mymap.size()<<'\n'; 
} 

但是,這並不工作,以創建條目的字符串。我不知道是什麼問題

+2

你爲什麼要用指針作爲鍵? 'std :: map '。 –

+0

此外,你忘了解釋什麼「這不工作」意味着你... –

回答

4

這裏的問題是你正在向地圖添加一個值,然後立即改變它。如果展開了代碼,你基本上是在做以下

iss >> field; 
mymap[&field[0]] = 0; 
iss >> field; // Error! 
mymap[&field[0]] = 0; 

的標記線是一個問題,因爲field成員存儲爲mymap裏面的關鍵。第三行將變異field,這意味着mymap中的關鍵字也發生了變異。這種類型的行爲是不允許的,地圖類型假定他們的密鑰是不可變的。突變它們使得不可能在以後可靠地檢索值

看起來你想要做的是將一個字符串與地圖中的int相關聯。如果是這樣,那麼只需使用std::string作爲關鍵。

map<std::string, int, ltstr> mymap; 
... 
while (iss>>field) { 
    mymap[field] = 0; 
} 

這將在地圖上爲每一行放置一個std::string的獨立副本。因此,突變不會影響地圖中的鍵。

注意:您可能將不得不昌ltstr採取const std::string&作爲輸入,而不是const char*以及使這種workt

還要注意的是,當你想轉換的std::stringconst char*不使用&field[0]而是使用標準方法field.c_str()

+0

謝謝賈裏德..我現在看到什麼問題 – addousas

+3

'ltstr'幾乎可以肯定是一個'strcmp'的包裝,所以我們不應該需要使用'std :: string'鍵。而且,'std :: string :: cstr()'不存在。 –