使用std :: multimap迭代器创建std :: list

时间:2018-11-06 15:17:09

标签: c++ list optimization std multimap

我具有以下功能:

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;
}

我正在创建一个包含一系列迭代器的列表,但出现错误。由于multimap中的迭代器,我是成对的,而list中的元素是唯一的。但是我不想迭代思想的迭代器,因为我将失去使用std::multimap而不是使用O(1)插入但找到O(n)的其他数据结构的好处。

是否可以根据需要创建列表?还是使用其他设计模式或数据结构会更好?

1 个答案:

答案 0 :(得分:4)

您需要什么std::transform,将范围转换到另一个范围。利用lambda,您可以像这样构建列表

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;
}