当请求的键丢失时,有没有办法从向量映射返回 std::vector ref?

Is there a way to return std::vector ref from a map of vectors when the requested key is missing?

本文关键字:映射 向量 返回 std ref vector 请求 有没有      更新时间:2023-10-16

快速说明:我目前无法访问这个项目的 C++11,所以虽然我有兴趣听到使用它的任何答案,但我无法使用任何特定于C++11 的东西。


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

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

枚举值是对象的一部分,因此集合最初填充如下:

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

我现在希望能够做的是拥有一个函数,该函数采用枚举值并返回对相应向量的 const 引用。我可以按如下方式执行此操作:

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

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

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

  • 能够通过简单地传入对象来添加对象(按类型自动排序)
  • 能够获取给定类型的所有对象
  • 能够查询给定类型的对象数量(即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>而不是原始指针。