c++ - 当请求的键丢失时,有没有办法从 vector 映射中返回 std::vector ref?

标签 c++ vector reference stl stdmap

快速说明:我目前无法在该项目上使用 C++11,因此虽然我有兴趣听到使用它的任何答案,但我无法使用任何 C++ 11 特定。


我有一个管理对象集合的类。此数据存储在 vector 映射中,以枚举“对象类型”作为键:

std::map<MyEnum, std::vector<MyObject *> > m_objectMap;

枚举值是对象的一部分,所以集合最初是这样填充的:

void MyCollection::AddObject(MyObject *object)
{
    m_objectMap[object->GetType()].push_back(object);
}

我现在想要做的是拥有一个函数,它接受一个枚举值并返回一个对相应 vector 的常量引用。我可以这样做:

const std::vector<MyObject *> &MyCollection::GetObjectsForType(MyEnum eType)
{
    return m_objectMap[eType];
}

唯一的问题是,使用 std::map::operator[] 是非 const,因为如果请求的枚举类型不是,它会添加一对存在于集合中,这意味着该函数不能是 const。或者,如果我首先检查映射以查看它是否包含键,如果键不存在,我不知道返回什么,因为它必须是对某物 的常量引用。

因此,我正在寻找有关设计此集合的更好方法(或返回空 const vector 引用的方法)的建议。主要目标围绕易用性:

  • 能够通过简单地传入对象来添加对象(按类型自动排序)
  • 能够获取给定类型的所有对象
  • 能够查询给定类型的对象数量(即 vector.size())

谢谢!

最佳答案

我会这样做:

const std::vector<MyObject *> &GetObjectsForType(MyEnum eType)
{
    static const std::vector<MyObject *> empty_vec;
    auto it = m_objectMap.find(eType);
    return it != m_objectMap.end() ? it->second : empty_vec;
}

关于整体设计,std::multimap<MyEnum, MyObject *>将是我的选择。然后 GetObjectsForType()可能是:

std::pair<iterator, iterator> GetObjectsForType(MyEnum eType)
{
    return m_objectMap.equal_range(eType);
}

我也会考虑使用 boost::unique_ptr<MyObject>而不是原始指针。

关于c++ - 当请求的键丢失时,有没有办法从 vector 映射中返回 std::vector ref?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44201445/

相关文章:

c++ - 是否有用于 C++ quickfix 的 MessageCodeGenerator?

c++ - 在 C++11 中使用不带托管共享指针的 shared_from_this()

c++ - 严重错误:找不到 'boost/uuid/uuid.hpp'文件

c++ - vector<double> 被转换为 vector<double, allocator<double>>

c++11 - 实现具有 const 正确性的可变参数 zip 函数

java - 在 Java 中通过引用传递?

c++ - Qt5 C++ QGraphicsView : Images don't fit view frame

Java Lambda - 查找包含 Vector3D 实例的三角形极值的更好方法

r - 如何从具有混合元素的列表中提取元素

ios - 防止 NSManagedObject 引用更新 UITableViewCell