0

我正在尝试使用模板参数声明一个 stl 映射,如下所示:(假设 T 为 typename,如下所示template <class T>:)

map<T, T> m;(在 .h 文件中)

它编译得很好。现在在我的 cpp 文件中,当我想插入地图时,我不能。我在智能感知上获得的唯一方法是“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
};
4

1 回答 1

1

将键值对插入 a 的常用方法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在地图中的值。)

于 2012-09-02T03:48:11.857 回答