2013-04-04 43 views
1

我通常用C語言編寫代碼。現在轉向C++。我有一個std::unordered_map與6000萬條目。它只加載一次,稍後不會被修改。我想不時將它傳遞給一些功能。std :: unordered_map通過引用傳遞

typedef unordered_map<uint64_t, mer*> mer_map; 
void test_pass_by_ref3(mer_map kmers) { 
} 

void test_pass_by_ref2(mer_map kmers) { 
    test_pass_by_ref3(kmers); 
} 

void test_pass_by_ref(mer_map kmers) { 
    test_pass_by_ref2(kmers); 
} 

如果我只想通過pointer,如何傳遞和查詢它像往常一樣:value = mer_map[key]但是這個代碼將每次複製哈希地圖嗎?我搜索並找到了passing by reference語法:

void foo(const ClassName &name) 
{ 
    ClassName& temp = const_cast<ClassName&>(name); 
    ... .... 
} 

但似乎無法編譯。請幫忙。謝謝。

+0

使用引用將是一個很好的C++方法。顯示你遇到的錯誤。 – 2013-04-04 15:39:01

+0

爲什麼不傳遞非const引用? – 0x499602D2 2013-04-04 15:40:51

+0

是的,我試過@juanchopanza建議的非const方法,它也可以。謝謝。 – Joy 2013-04-04 16:58:12

回答

12

我猜你的問題是,operator[]const,因爲它增加了,是不是已經在與鍵訪問的默認構造的元素在地圖中。 您可以使用at(),即假設關鍵是目前否則拋出異常:

typedef unordered_map<uint64_t, mer*> mer_map; 

void foo(const mer_map& m) 
{ 
    mer* val = m.at(key); 
} 

或使用std::unordered_map::find()

void foo(const mer_map& m) 
{ 
    auto it = m.find(key); 
    if (it != m.end()) 
    { 
    // element is in map, use it 
    mer* val = it->second; 
    } 
} 

注意:您可能還通過傳遞繞開的問題一個非const引用,但是通過這樣做你就是說這個函數會修改地圖。如果你真的打算修改一個對象,你應該只使用非const引用。

void foo(mer_map& m) 
{ 
    mer* val = m[key]; 
} 
+0

謝謝,@ juanchopanza – Joy 2013-04-04 15:49:17

2

要參照使用通你的函數應該聲明如下

typedef unordered_map<uint64_t, mer*> mer_map; 
void test_pass_by_ref3(mer_map& kmers) { 
} 

void test_pass_by_ref2(mer_map& kmers) { 
    test_pass_by_ref3(kmers); 
} 

void test_pass_by_ref(mer_map& kmers) { 
    test_pass_by_ref2(kmers); 
} 

這將工作正常的訪問操作

mer_map[key] 

和訪問成員函數一樣

mer_map.find(
東西

要通過他們應該是這樣的形式

typedef unordered_map<uint64_t, mer*> mer_map; 
void test_pass_by_poi3(mer_map *kmers) { 
} 

void test_pass_by_ref2(mer_map *kmers) { 
    test_pass_by_poi3(kmers); 
} 

void test_pass_by_ref(mer_map *kmers) { 
    test_pass_by_poi2(kmers); 
} 

但是在指針版本使用,你必須取消引用指針第一接入運營商的指針。

(*mer_map)[key] 

和訪問成員函數類似

kmers->find(
+0

謝謝,@stardust_ – Joy 2013-04-04 15:49:36

0

對於mapunordered_map索引操作者[]是非const因爲不存在將導致創建的元素的索引調用它。如果您不想創建元素,則使用at()。然後你可以使用const引用來訪問mapunordered_map。請注意,如果元素不存在,則會拋出at()

您可以使用一個迭代器來測試是否存在:

bool 
esists(const mer_map& kmers, uint64_t i) 
{ 
    unordered_map<uint64_t, mer*::const_iterator it = kmers.find(i); 
    return it != kmers.end(); 
} 

或者您也可以通過迭代器訪問mer_maps在你的代碼。