Создать std :: list с помощью итераторов std :: multimap - PullRequest
0 голосов
/ 06 ноября 2018

У меня есть следующая функция:

std::list<std::shared_ptr<Object>> AnimalManager::GetObjectsOfType(std::string type)
{    
    std::pair <std::multimap<std::string, std::shared_ptr<Object>>::iterator, std::multimap<std::string, std::shared_ptr<Object>>::iterator> ret;
    ret = m_objects.equal_range(type);

    std::list<std::shared_ptr<Object>> objectsOfType(ret.first, ret.second);

    return objectsOfType;
}

Я создаю список с диапазоном итераторов, но получаю ошибку. У меня из-за итераторов в мультикарте есть пары, а элементы в списке уникальны. Но я не хочу повторять итераторы мыслей, потому что я потеряю преимущество, которое я получаю, используя std::multimap вместо других strcuture данных со вставкой O (1), но O (n) find.

Можно ли создать список так, как я хочу это сделать? Или было бы лучше, если бы я использовал другой шаблон проектирования или структуру данных?

1 Ответ

0 голосов
/ 06 ноября 2018

Что вам нужно std::transform в преобразование диапазона в другой. Используя лямбду, вы можете построить список как

std::list<std::shared_ptr<Object>> AnimalManager::GetObjectsOfType(std::string type)
{    
    auto ret = m_objects.equal_range(type);

    std::list<std::shared_ptr<Object>> objectsOfType;
    std::transform((ret.first, ret.second, std::back_inserter(objectsOfType),
                   [](const auto& pair){ return pair.second; });

    return objectsOfType;
}
...