使用 std::multimap 个迭代器创建 std::list
Create std::list with std::multimap iterators
我有以下功能:
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 中的迭代器是成对的,而列表中的元素是唯一的。但是我不想迭代思想迭代器,因为我将失去使用 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;
}
我有以下功能:
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 中的迭代器是成对的,而列表中的元素是唯一的。但是我不想迭代思想迭代器,因为我将失去使用 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;
}