我必须将std :: map存储为std :: map中的值
std::map< std::string, std::map<std::string, std::string> > someStorage;
Run Code Online (Sandbox Code Playgroud)
如何插入第二个(内部)地图?我尝试过:
someStorage.insert( std::make_pair("key", std::make_pair("key2", "value2")) );
Run Code Online (Sandbox Code Playgroud)
但这会引发很多错误.怎么了?
我正在使用STL映射数据结构,此时我的代码首先调用find():如果键以前不在映射中,则调用insert()它,否则它什么都不做.
map<Foo*, string>::iterator it;
it = my_map.find(foo_obj); // 1st lookup
if(it == my_map.end()){
my_map[foo_obj] = "some value"; // 2nd lookup
}else{
// ok do nothing.
}
Run Code Online (Sandbox Code Playgroud)
我想知道是否有比这更好的方法,因为据我所知,在这种情况下,当我想插入一个尚未出现的密钥时,我在地图数据结构中执行2次查找:一次用于查找( ),insert()中的一个 (对应于operator []).
提前感谢任何建议.
我可以通过两种方式轻松地在C++ STL中创建一个关键的值属性:映射和对的集合.例如,我可能有
map<key_class,value_class>
Run Code Online (Sandbox Code Playgroud)
要么
set<pair<key_class,value_class> >
Run Code Online (Sandbox Code Playgroud)
在算法复杂性和编码风格方面,这些用法有何不同?
Lists,Maps等中的groupBy方法在函数后生成Map.
有没有办法使用groupBy生成一个保留插入顺序的Map(例如LinkedHashMap)?
我正在使用for循环手动插入,但我想知道一个有用的已定义函数是否可以帮助我.
提前致谢.
到目前为止,我总是使用迭代器遍历STL映射中的所有键,如下所示:
for (std::map<char,int>::iterator it=mymap.begin(); it!=mymap.end(); ++it){
std::cout << it->first << " => " << it->second << '\n';
}
Run Code Online (Sandbox Code Playgroud)
最近虽然我遇到了一些使用不同样式来迭代键的代码,如下所示.此功能是否仅在最近修订后的标准中添加?与许多其他语言已经提供的一样,这似乎是一种使用较少代码完成更多工作的相当有趣的方式.
for (auto& x: mymap) {
std::cout << x.first << " => " << x.second << '\n';
}
Run Code Online (Sandbox Code Playgroud)
此外,我很想知道在这里使用关键字"auto"的确切含义.
我正在使用Leaflet.js在地图上工作,它使用了许多标记(最终会有~40个标记).每个标记都有一个带有详细信息的相关弹出框 Leaflet.js的默认行为似乎是自动打开至少一个标记的弹出窗口(我相信最后列出的标记).
我希望在初始加载地图页面时关闭所有弹出窗口,以便用户必须单击标记才能打开弹出窗口.有谁知道如何做到这一点?我这里有一个原型:
http://dev.monographic.org/maps/prototype-10.html
谢谢.
我有这样的代码:
class MapIndex
{
private:
typedef std::map<std::string, MapIndex*> Container;
Container mapM;
public:
void add(std::list<std::string>& values)
{
if (values.empty()) // sanity check
return;
std::string s(*(values.begin()));
values.erase(values.begin());
if (values.empty())
return;
MapIndex *mi = mapM[s]; // <- question about this line
if (!mi)
mi = new MapIndex();
mi->add(values);
}
}
Run Code Online (Sandbox Code Playgroud)
我关注的主要问题是,如果将新项目添加到地图中,mapM [s]表达式是否会返回对NULL指针的引用?
的SGI文档这样说:DATA_TYPE&运算符[](常量为key_type&K)返回到与特定键相关联的对象的引用.如果映射尚未包含此类对象,则operator []将插入默认对象data_type().
所以,我的问题是插入默认对象data_type()是否会创建一个NULL指针,还是会创建指向内存中某处的无效指针?
我有两个列表,a List[A]和a List[B].我想要的是一个,Map[A,B]但我想要的语义zip.所以从这样开始:
var tuplesOfAB = listOfA zip listOfB
Run Code Online (Sandbox Code Playgroud)
现在我不知道如何构建一个Map来自我的tuplesOfAB.
作为一个后续问题,我也想反转我的地图,以便从Map[A,B]我可以创建一个Map[B,A].任何人都可以用线索打我吗?
我需要创建电话簿类的东西.它包含姓名和号码.现在当我键入字母时,应该返回匹配列表.对于下面给出的示例,当我键入H时,应返回包含Harmer,Harris,Hawken,Hosler的列表.当输入Ha然后列出只包含Harmer,Harris,Hawken的列表应该返回.
Map<String, String> nameNum = new HashMap<String, String>();
nameNum.put("Brown", "+1236389023");
nameNum.put("Bob", "+1236389023");
nameNum.put("Harmer", "+1236389023");
nameNum.put("Harris", "+1236389023");
nameNum.put("Hawken", "+1236389023");
nameNum.put("Hosler", "+1236389023");
Run Code Online (Sandbox Code Playgroud)
任何想法如何实现呢?提前致谢.