如何从存储在std::映射中的std::集中删除元素
How do I delete elements from an std::set that is stored inside a std::map?
我在一个类中存储了以下数据结构。
class MyClass {
private:
std::map<std::string, std::set<std::string>> myMap;
public:
void remove(std::string id); //trying to remove items from sets inside myMap
}
然后有一种方法可以尝试从集合中删除项目。我尝试了以下两种方法,但都不起作用。方法1,使用for
范围。
for (auto pair : myMap) {
auto set = pair.second;
if (set.count(id)) {
set.erase(id);
}
}
方法2,使用iterator
。
auto it = myMap.begin();
while (it != myMap.end()) {
auto set = it->second;
if (set.count(id)) {
set.erase(id);
}
it++;
}
在C++中,从映射内的集合中删除元素的正确方法是什么?请注意,当我将myMap
定义为std::map<std::string, std::set<std::string>*>
(指针(时,我的代码就可以工作了。
假设我们有一个std::map
,如下所示:
std::map<std::string, std::set<std::string>> myMap;
myMap["a"].insert("aaa");
myMap["a"].insert("abb");
myMap["a"].insert("acc");
myMap["b"].insert("aaa");
myMap["b"].insert("abb");
myMap["b"].insert("acc");
然后,您可以通过执行以下操作从std::set
中删除项目:
for (auto& i : myMap) {
i.second.erase("aaa");
}
演示
为什么从问题出发的方法不起作用
因为,通过执行以下for(auto pair : myMap) {...}
和auto set = pair.second;
,您实际上正在处理来自myMap
的数据副本。因此,您需要使用对实际数据的引用,如for(auto& pair : myMap) {...}
和auto& set = pair.second;
。
此外,如果数据存在,std::set::erase
将从std::set
中删除数据,因此不需要手动检查是否存在id。
您正在复制要变异的对象。你似乎有Java背景。在C++中,如果您想要引用语义(与值语义相反(,则应该使用引用(在本例中为auto &
,而不是auto
(。以下是您的操作方法:
#include <algorithm>
#include <map>
#include <set>
#include <string>
class MyClass {
private:
std::map<std::string, std::set<std::string>> myMap;
public:
void remove(std::string const& id) {
std::for_each(myMap.begin(), myMap.end(),
[&id](auto& p) { p.second.erase(id); });
}
};
相关文章:
- 使用std::multimap迭代器创建std::list
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- 从持续时间构造std::chrono::system_clock::time_point
- std::具有相同基类的类的变体
- std::向量与传递值的动态数组
- 使用std::vector的OpenCL矩阵乘法
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- std::condition_variable::wait()如何评估给定的谓词
- 如何获取std::result_of函数的返回类型
- std::原子加载和存储都需要吗
- 如何从存储在std::映射中的std::集中删除元素
- 在std::集中获取与给定元素最接近的元素
- 如何有效地从std::集中选择随机元素
- 如何有效地将一系列连续整数插入std::集中
- 是否可以从std::集中移出一个项目
- C++:使用 std::function 在多集中插入元组,并保持顺序
- 如何优雅地将所有枚举放入std::集中