map :: erase:按键或迭代器擦除之间的区别?

时间:2014-02-18 05:42:01

标签: c++ map stl

如果我想从地图中删除单个元素(除了可能的错误检查之外我并不关心返回值),我有两种方法可以实现:erase按键或{ {1}}按值:

http://ideone.com/YWocN7

erase

输出:

#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;
}

这两种方法是完全等效的,还是有任何实际的理由或情况,我可能更喜欢一种

2 个答案:

答案 0 :(得分:3)

在您描述的场景中(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 :(得分:1)

地图擦除支持以不同方式删除元素

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 );

在你的情况下,你正在使用erase(迭代器)和erase(const key_type),即使两个操作的结果相同,操作的执行方式也可能不同。

erase( const key_type& key );会找到密钥然后将其删除。

erase( iterator)已经有想要删除元素的位置