在c ++中使用用户定义的类型作为映射值

时间:2018-01-31 09:49:10

标签: c++ gcc stdmap

我是C ++编程的新手,使用std :: map类时遇到了问题。 我想将int值映射到自定义类型。地图应该包含实际值而不是指向它的指针! 例: 我想这样做:datetime而不是map<int,Type>

我尝试的是:

map<int,Type*>

错误消息是

  

错误:没有匹配函数调用'Type :: Type()'秒(std :: forward&lt; _Args2&gt;(std :: get&lt; _Indexes2&gt;(__ tuple2))...)

map<int,Type> myMap; myMap.insert(make_pair(keyVal,Type(intVal,intVal,intVal))); //Type takes 3 int-values for construction. myMap[intVal].useMemberFunction(); 是我的用户定义类型。是否可以实例化这样的对象,或者我是否必须以某种方式使用Type运算符?
我怎样才能做到这一点? 我在网上搜索它,但我找到的只是使用用户定义的类型作为键,这不是我想要做的。

1 个答案:

答案 0 :(得分:2)

  

是否可以实例化像这样的对象

是的,是的。

  

还是我必须以某种方式使用new运算符?

不,你不是。

  

我怎样才能做到这一点?

这已经有效,假设您定义了示例中缺少的变量和类型:

#include <map>
#include <utility>
using std::map;
using std::make_pair;

struct Type {
    Type(int,int,int){}
    Type(){}
    void useMemberFunction(){}
};

int main() {
    int keyVal = 0, intVal = 0;
    map<int,Type> myMap;
    myMap.insert(make_pair(keyVal,Type(intVal,intVal,intVal))); //Type takes 3 int-values for construction.
    myMap[intVal].useMemberFunction();
}

但需要注意的是:根据文档,std::map::operator[]要求值类型是默认可构造的。如果类型不是默认可构造的,那么您不能使用下标运算符。您可以改为使用std::map::atstd::map::find