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

Create std::list with std::multimap iterators

提问人:Carlos Hernández 提问时间:11/6/2018 最后编辑:NathanOliverCarlos Hernández 更新时间:11/7/2018 访问量:98

问:

我有以下功能:

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

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

是否可以按照自己的意愿创建列表?或者如果我使用另一种设计模式或数据结构会更好吗?

C++ 列表 优化 std multimap

评论


答:

4赞 NathanOliver 11/6/2018 #1

你需要什么 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;
}