2010-08-26 86 views
7

我有一個std :: map,我想添加一個有效的鍵來稍後迭代它,但沒有給出任何值(它將在迭代過程中稍後給出)。如何在不指定值的情況下添加有效密鑰到std :: map?

這是我要做的事現在:

std::vector<std::string> valid_keys; 
//Fill... Then : 
std::map<std::string, float> map; 
for(size_t i = 0 ; i < valid_keys.size() ; ++i) { 
    /*I don't want to do that because in fact I don't use a float type*/ 
    map[valid_keys[i]] = 0.f; //<- 
} 
//Using : 
for(std::map<std::string, float>::iterator it = map.begin() ; it != map.end() ; ++it) { 
    it->second = 0; //Dummy 
} 

我怎麼能這樣做嗎?

請事先說明。

+1

「/ *我不想這樣做,因爲實際上我沒有使用float類型* /」但是你定義了'std :: map '爲什麼用一個如果你不想存儲浮動浮動浮動? – 2010-08-26 16:13:44

+2

通過用紅鯡魚混淆它,試圖找出真正的問題是什麼讓它變得更有趣。如果它太容易,那麼你不會欣賞這個謎。 – 2010-08-26 16:30:01

回答

10

我不完全知道你的意思是「沒有給予任何價值」,但如果你的意思是不明確的分配值,那麼就去做

map[valid_keys[i]]; 

這仍然有效,即它會在一個新的條目如果之前沒有那個鍵,則映射該映射。該operator[]只是返回一個refernce的值,以便您可以分配一個新的值,但記住它的已經默認構建

另一方面,如果您的意思是您要表達的是沒有意義的價值,並且它可能會或可能不會收到有效的價值,那麼請參閱@UncleBens` answer

+0

我甚至沒有想到這一點(對我感到羞恥),謝謝! @Binary worrier:對於這個問題感到抱歉,我應該重新制定。 – 2010-08-26 18:51:39

+0

@Mister:'map [key];'相當於'map [key] = value_type();'。在你的例子中,這將是'map [「key」] = float();'。用任何其他類型(具有默認構造函數)替換float。 – sbi 2010-08-26 19:36:03

7

我想可以幫助你的東西是Boost.Optional

#include <boost/optional.hpp> 
#include <map> 

class CantConstructMe 
{ 
    CantConstructMe() {} 
}; 

int main() 
{ 
    std::map<int, boost::optional<CantConstructMe> > m; 
    m[0]; 
} 

缺乏可用的默認構造函數是不是一個問題,在默認情況下optional將是空的。

+0

+1 - 我實際上認爲這是OP正在尋找的東西。 – 2010-08-26 16:28:51

5

/*我不想這樣做,因爲其實我不使用浮點類型*/

然後,而不是std::map使用std::set

0

看起來好像你真的想要一個std :: set或std :: key列表,然後迭代該集合以創建你的地圖。如果由於某種原因,這是不可接受的,你可以用一些實現了float float()的對象和float的各種轉換函數來包裝你的float,但也有一個「good()」標誌或者somesuch 。

如果您的最終值實際上是浮動的,您可以將值初始化爲+/- NaN作爲一個簡單的佔位符。

我會說boost :: optional是生產代碼的更好選擇,但它取決於您的要求。

相關問題