Как удалить одну пару ключ-значение из std :: map - PullRequest
0 голосов
/ 11 июля 2019

Я хочу удалить один элемент значения ключа из 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());

Я думал, что смогу использовать ключ () и 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>'

Ответы [ 2 ]

1 голос
/ 11 июля 2019

Вы ответили на вопрос самостоятельно.

Я просто хочу добавить полный пример. Пожалуйста, смотрите:

#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;
}
0 голосов
/ 11 июля 2019

Ответ был предложен Марком. Для std :: map мне нужно использовать mapped () на полученном узле, а не value. Большое спасибо!

Итак, вот так

auto keyAndValue = myMap.extract(myMap.find(instanceOfClass1));

auto key = keyAndValue.key();

auto value = std::move(keyAndValue.mapped());
...