[英]How to return a value from std::map<int, std::string> with a uint64_t key type?
新手問題,但我進行了搜索,找不到明顯解決我問題的方法-如果很明顯,我們深表歉意。
我定義了一個看起來像這樣的地圖:
map<int, string> testmap = {
{ 0, "a" },
{ 1, "b" },
{ 2, "c" }
}
但是,我需要使用另一個函數提供的uint64_t
值從testmap
檢索一個值。
當我執行testmap[my_uint64_t_value]
它返回一個空字符串,所以我認為這是因為它將my_uint64_t_value
添加為鍵並將其值設置為NULL
。
如果將映射類型設置為<uint64_t, string>
,至少在當前定義鍵的方式上,這是相同的。
但是,有沒有一種方法可以:
uint64_t
值轉換為常規int
<uint64_t, string>
,並能夠將我的鍵定義為“正確”類型? 似乎int
類型轉換並不常見,應該避免這種情況嗎?
得到空字符串的原因是std :: map :: operator [] 當且僅當該值存在時才返回對該值的引用,否則它將執行插入 。 我懷疑你有后一種情況。
您需要使用std :: map :: find進行搜索。
uint64_t keyToFind = 1;
if (auto iter = testmap.find(keyToFind); iter != testmap.cend())
{
// do something
std::cout << "Found!\n";
}
else { std::cout << "Not Found!\n"; }
就像注釋中提到的@Rene一樣,從uint64_t
為int
可能導致溢出。 因此,將密鑰設為更大的類型(按要求)將是一個好主意。
std::map<uint64_t, std::string> testmap;
如另一個答案中所述,如果鍵不存在於映射中,則映射類的[]
運算符將使用默認構造的值執行插入。
您可以先使用count
方法來確定鍵,然后再訪問它。
if(testmap.count(keyToFind))
return testmap[keyToFind];
else
report_key_not_found();
另一種解決方案是使用at
方法訪問值。 如果該鍵不存在,則將引發std::out_of_range
異常,而不是插入新鍵。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.