我试图用模板参数声明一个stl贴图,如下所示:
(假设T为typename,如:template <class T>
)
map<T, T> m;
(在.h文件中)
编译好。现在在我的cpp文件中,当我想插入地图时,我无法做到。我在intellisense上获得的唯一方法是“at”和“swap”方法。
有什么想法吗?有人请吗?
提前致谢。
这是示例代码:
#pragma once
#include <iostream>
#include <map>
using namespace std;
template <class T>
class MySample
{
map<T, T> myMap;
//other details omitted
public:
//constructor
MySample(T t)
{
//here I am not able to use any map methods.
//for example i want to insert some elements into the map
//but the only methods I can see with Visual Studio intellisense
//are the "at" and "swap" and two other operators
//Why???
myMap.
}
//destructor
~MySample(void)
{
}
//other details omitted
};
答案 0 :(得分:1)
将键值对插入std::map
的常用方法是索引运算符语法和insert
函数。对于示例,我假设std::string
代表键,int
代表值:
#include <map>
#include <string>
std::map<std::string,int> m;
m["hello"] = 4; // insert a pair ("hello",4)
m.insert(std::make_pair("hello",4)); // alternative way of doing the same
如果您可以使用C ++ 11,则可以使用新的统一初始化语法而不是make_pair
调用:
m.insert({"hello",4});
而且,如评论中所述,还有
m.emplace("hello",4);
在C ++ 11中,它就地构造新的键值对,而不是在地图之外构造它并将其复制进来。
我应该补充一点,因为你的问题实际上是关于初始化,而不是插入新元素,并且确实你在MyClass
的构造函数中这样做了,你应该做什么(在C ++ 11中)是这样的:
MySample(T t)
: myMap { { t,val(t) } }
{}
(这里我假设有一些函数val
生成在地图中存储t
的值。)