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

Create std::list with std::multimap iterators

本文关键字:std list 创建 multimap 使用 迭代器      更新时间:2023-10-16

我有以下功能:

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而不是使用O(1(插入但O(n(查找的其他数据结构所获得的好处。

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

您需要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;
}