gpt4 book ai didi

c++ - map::erase:按键删除和迭代器删除之间的区别?

转载 作者:行者123 更新时间:2023-11-30 01:54:34 24 4
gpt4 key购买 nike

如果我想从 map 中删除单个元素(除了可能的错误检查之外我不关心返回值),有两种方法可以实现: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}

这两种方法是否完全等同,或者是否有任何实际原因或情况使我可能偏爱其中一种

最佳答案

在您描述的场景中(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);
}

关于c++ - map::erase:按键删除和迭代器删除之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21845252/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com