当请求的键丢失时,有没有办法从向量映射返回 std::vector ref?
Is there a way to return std::vector ref from a map of vectors when the requested key is missing?
快速说明:我目前无法访问这个项目的 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>
而不是原始指针。
相关文章:
- 如何在 c++ 中创建结构向量的映射
- 在C++中初始化向量映射的最有效方法
- C++ STD 函数运算符:有没有一种方法可以通过函数将一个向量映射到另一个向量上?
- 字符串共享内存映射的向量
- 具有 2 个分量的数组的特征映射到 3 的向量
- 当键值是 std 向量时,为什么使用 at in C++ 访问映射值如此缓慢?
- 当映射包含字符串向量作为值时,从值中获取键的有效方法
- 如何初始化 std::向量的映射?
- 访问映射中的分区向量
- 如何将整数向量插入到键中,标准::映射的值
- 将一个向量映射到不同的对,即使向量映射到每对时是不同的?
- 如何从向量映射中迭代向量
- 访问映射向量的映射元素(c++)
- 映射向量的时间复杂性是多少
- C++:通过从映射向量分配映射实例来填充映射的映射
- 在一个映射向量上迭代,如果满足条件,则插入一个副本
- 如何在映射向量中循环访问地图
- 丢弃限定符 访问类中的映射向量时出错
- 从常量迭代器到映射向量,获取映射向量中映射元素的键和值
- 映射向量c++