我想从 std::map 中删除一个键值元素,并保留存储在该映射中的值。仅仅删除它是不够的,我需要为其他东西存储的键和值。
我的例子是这样的:
std::map<const Class1 *, std::unique_ptr<Class 2>> myMap;
我想从 std::map 中提取键和值。简单地将它移开不是一种选择,因为这会使 std::map 处于不正确的状态。
我找到了 std::extract 函数,我可以将它用于 std::set,但不能用于 std::map。我无法在网上找到任何示例来说明如何从此映射中提取键和值。
我想做这样的事情:
auto keyAndValue = myMap.extract(myMap.find(instanceOfClass1));
auto key = keyAndValue.someMethod();
auto value = std::move(keyAndValue.someOtherMethod());
我认为我可以使用 key() 和 value(),如某些示例中所述。但这不起作用,我得到一个错误。
error C2039: 'value': is not a member of
'std::_Node_handle<std::_Tree_node<std::pair<const
_Kty,_Ty>,std::_Default_allocator_traits<_Alloc>::void_pointer>,_Alloc,std::_Node_handle_map_base,_Kty,_Ty>'
最佳答案
你自己回答了这个问题。
我只想添加一个完整的示例。请参阅:
#include <iostream>
#include <map>
#include <functional>
#include <memory>
struct Class1
{
void someMethod() const { std::cout << "Some Method from class 1\n";}
};
struct Class2
{
Class2(const int i) : test(i) {}
void someOtherMethod() const { std::cout << "Some other Method from class 2. Index: " << test << '\n';}
int test{0};
};
int main()
{
Class1 cl1_1{}, cl1_2{}, cl1_3{};
std::map<const Class1 *, std::unique_ptr<Class2>> myMap;
// Populate map
myMap[&cl1_1] = std::make_unique<Class2>(1);
myMap[&cl1_2] = std::make_unique<Class2>(2);
myMap[&cl1_3] = std::make_unique<Class2>(3);
// Extract data
auto keyAndValue = myMap.extract(myMap.find(&cl1_1));
// Get key and value
auto key = keyAndValue.key();
auto value = std::move(keyAndValue.mapped());
// Call methods
key->someMethod();
value->someOtherMethod();
return 0;
}
关于c++ - 如何从 std::map 中删除一个键值对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56990965/