【问题标题】:remove elements from `map` that are not in `set`从 `map` 中删除不在 `set` 中的元素
【发布时间】:2025-11-28 01:05:01
【问题描述】:
std::map<std::string, Obj> myMap;
std::set<std::string> mySet;

我想从myMap 中删除那些不在mySet 中的键。

我该怎么做?我找到了std::remove_if算法,但是这里好像不适用。

【问题讨论】:

  • 您能否详细说明为什么remove_if 不适用?
  • @juanchopanza: remove_if 需要重新排列给定的序列,这是地图无法做到的。
  • @KerrekSB 我希望 OP 将这类信息放在问题中。没关系。
  • @Kerrek @juanchopanza SB 此外,我无法编译它。我怀疑remove_if 不能应用于std::map

标签: c++ c++11 stdmap stl-algorithm


【解决方案1】:

我将从这个简单的方法开始:

for (auto it = myMap.begin(); it != myMap.end(); )
{
    if (mySet.find(it->first) == mySet.end()) { myMap.erase(it++); }
    else                                      { ++it;              }
}

如果您想要更高效的东西,您可以同步迭代这两个容器并进行按键比较以利用兼容的元素顺序。另一方面,本算法甚至适用于无序容器,并且鉴于您的键是字符串,无序容器无论如何可能具有更好的性能。

【讨论】:

  • 在迭代地图时从地图中删除元素真的很酷吗?它不会导致未定义的行为吗?
  • @Nick:这很酷......参见例如en.cppreference.com/w/cpp/container/map/erase "其他引用和迭代器不受影响。" - 所以it++erase 启动之前有效地将it 推进到下一个迭代器(不受影响)。