2014-02-18 86 views
0

如果我想從地圖中刪除單個元素(除了可能的錯誤檢查,我不關心返回值),我可以通過以下兩種方法實現:鍵erase或值erasemap :: erase:按鍵或迭代器擦除的區別?

http://ideone.com/YWocN7

#include <iostream> 
#include <map> 
using namespace std; 

void printMap(const std::map<int, double>& m) 
{ 
    for (auto kv : m) 
    { 
     std::cout << '{' << kv.first << ", " << kv.second << '}'; 
    } 
    std::cout << '\n'; 
} 

int main() { 
    std::cout << "erase by iterator:\n"; 
    std::map<int, double> m1 = { { 1, 1.1 }, { 2, 2.2 }, { 3, 3.3 } }; 
    printMap(m1); 
    m1.erase(m1.find(2)); 
    printMap(m1); 

    std::cout << "erase by key:\n"; 
    std::map<int, double> m2 = { { 1, 1.1 }, { 2, 2.2 }, { 3, 3.3 } }; 
    printMap(m2); 
    m2.erase(2); 
    printMap(m2); 
    return 0; 
} 

輸出:

erase by iterator: 
{1, 1.1}{2, 2.2}{3, 3.3} 
{1, 1.1}{3, 3.3} 
erase by key: 
{1, 1.1}{2, 2.2}{3, 3.3} 
{1, 1.1}{3, 3.3} 

是兩種方法完全等價,或是否有任何PRAC tical理由或情況,我可能比其他更喜歡一個嗎?

+0

擦除通過迭代器應該是稍微快一點,因爲它並沒有走在樹尋找鑰匙第一的位置。 – Brian

回答

1

在你描述的場景中(m1.erase(2);m1.erase(m1.find(2));),這兩種方法應該是完全等價的,但是這要取決於你的STL實現,但是要付出或者花費創建和返回迭代器的代價。
erase by iterator的要點是當你已經有一個迭代器,因爲你的程序需要在這個迭代器引用的元素上執行的其他操作時,從這個鍵移除一個條目。例如:

void processEntry(const std::pair<int, double>& p) { 
    // do something like maybe writing it to a file 
} 

std::map<int, double> m1 = { { 1, 1.1 }, { 2, 2.2 }, { 3, 3.3 } }; 

const auto it = std::find_if(m1.begin(), m1.end(), [](const std::pair<int, double>& p) { 
    return p.first > 1 && p.second < 3.0; 
}); 

if (it != m1.end()) { 
    processEntry(*it); 
    m1.erase(it); 
} 
1

地圖擦除支持擦除以不同的方式elemnt(S)如下

void erase(iterator pos); 
iterator erase(const_iterator pos); 
void erase(iterator first, iterator last); 
iterator erase(const_iterator first, const_iterator last);   
size_type erase(const key_type& key); 

在你如果你正在使用擦除(迭代器)和擦除(常量爲key_type),即使結果這兩個操作是相同的如何執行操作可能會有所不同。

erase(const key_type& key);將找到密鑰,然後將其刪除。

erase(iterator)已經具有想要刪除的元素