Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 当请求的键丢失时,是否有方法从向量映射返回std::vector ref?_C++_Vector_Reference_Stl_Stdmap - Fatal编程技术网

C++ 当请求的键丢失时,是否有方法从向量映射返回std::vector ref?

C++ 当请求的键丢失时,是否有方法从向量映射返回std::vector ref?,c++,vector,reference,stl,stdmap,C++,Vector,Reference,Stl,Stdmap,快速提示:我目前没有访问此项目的C++11的权限,因此,尽管我对使用它听到任何答案感兴趣,但我无法使用任何特定于C++11的东西 我有一个管理对象集合的类。此数据存储在向量映射中,枚举对象类型作为键: std::map<MyEnum, std::vector<MyObject *> > m_objectMap; 我现在想做的是有一个函数,它接受一个枚举值并返回一个对相应向量的常量引用。我可以这样做: const std::vector<MyObject *>

快速提示:我目前没有访问此项目的C++11的权限,因此,尽管我对使用它听到任何答案感兴趣,但我无法使用任何特定于C++11的东西

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

std::map<MyEnum, std::vector<MyObject *> > m_objectMap;
我现在想做的是有一个函数,它接受一个枚举值并返回一个对相应向量的常量引用。我可以这样做:

const std::vector<MyObject *> &MyCollection::GetObjectsForType(MyEnum eType)
{
    return m_objectMap[eType];
}
唯一的问题是,使用std::map::operator[]是非常量的,因为如果请求的枚举类型在集合中不存在,它会添加一对,这意味着此函数不能是常量。或者,如果我首先检查映射以查看它是否包含键,那么如果键不存在,我不知道返回什么,因为它必须是对某个对象的常量引用

因此,我正在寻找一种更好的方法来设计这个集合,或者一种返回空常量向量引用的方法。主要目标围绕易用性:

通过简单地按类型自动排序传入对象来添加对象的能力 能够获取给定类型的所有对象 能够查询给定类型的对象数量,即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;
}

我也会考虑使用Booo::UnQuyjpTR代替原始指针。

可以使MyObjutM映射可变。您可以返回一个特殊NA对象的引用,以指示没有值。我没有想到使用静态空列表,我喜欢这样!我以前没有使用过multimap,看起来它在这里很好用。只有一次更正;在您的第一个代码块中,我相信返回应该是it->second,而不仅仅是*it。我们有一个更健壮的共享指针类型,我只是使用原始指针来简化示例。谢谢@泰勒:很高兴这有帮助。我修好了它->第二件事。
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::pair<iterator, iterator> GetObjectsForType(MyEnum eType)
{
    return m_objectMap.equal_range(eType);
}