c++ - 使用 std::multimap 迭代器创建 std::list

标签 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 中的迭代器是成对的,而列表中的元素是唯一的。但我不想迭代思想迭代器,因为我将失去使用 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;
}

关于c++ - 使用 std::multimap 迭代器创建 std::list,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53174774/

相关文章:

c++ - 我不明白为什么 for-loop 不适用于此代码

python - scipy 中的有界根查找

python - 在一个字符串中追加和替换对象

最大化列表中相等元素数的 Python 算法

c++ - 高效计算 32 位整数乘法的高阶位

C++ - 如何有效地找出 vector 中的任何字符串是否可以从一组字母中组装出来

c++ - 如何编写跨平台(32 位和 64 位)垃圾汇编代码?

c++ - 为什么 std::sort 比较函数必须在参数相等时返回 false?

c++ - 有没有其他方法可以在没有 vector 的情况下用 C++ 填充数组

python - 合并具有不同长度的掩码数组的二维列表