将另一个map插入到std::map中

3

我按照这个答案编写了下面的代码。但它给出了以下编译错误。我认为这是因为make_pair不能接受另一个make_pair作为参数。那么替代方法是什么呢?

error: no matching function for call to ‘std::map<std::basic_string<char>, std::map<float, int>
>::insert(std::pair<std::basic_string<char>, std::pair<double, int> >)’

以下是代码

#include <iostream>
#include <map>
#include <string>

int main() {
    std::map<std::string, std::map<float, int> > map1;
    std::string string1 = "alpha";
    map1.insert(std::make_pair(string1, std::make_pair(1.1, 1)));
    return 0;
}

2
不确定你在这里尝试什么,但是浮点数运算的不准确性使得具有浮点数键的映射难以处理。 - john
@john 我正在制作一个由浮点数和整数组成的映射表。后来我想在映射表内搜索特定的浮点数值。你是否建议说映射表不适用于这个任务? - user13107
1
你必须小心确保浮点数值是准确的。根据你所做的计算,这可能并不容易。我并不是说它一定是错的,只是存在陷阱。你可以将0.1添加到你的映射中,但当你搜索时,你可能会得到0.09999999999999999,导致搜索失败。 - john
@user13107 John非常准确。你可以做到,但你需要一个相当聪明的比较器,可能必须考虑到不准确性,字面上说是“足够接近”。例如,插入一个键1.1,然后搜索一个计算出来的 key = 1.0 + 0.1可能会让你感到惊讶。 - WhozCraig
@john和WhozCraig,你们有什么地图替代方案建议吗? - user13107
1
@user13107,您仍然可以使用Map,只需要了解浮点数比较的方式,可能需要为您尝试做的事情编写自定义键比较器。如果您以前从未阅读过它,请在有机会时阅读一下:计算机科学家应该了解的关于浮点算术的所有内容。它很长,但很值得,而且是一个真正的启示。 - WhozCraig
2个回答

3
你正在使用一个不是 map 类型的对象来初始化你的“pair”结构的后半部分。
#include <iostream>
#include <map>
#include <string>

int main() {
    std::map<std::string, std::map<float, int> > map1;
    std::string string1 = "alpha";
    std::map<float,int> mapsub;
    mapsub.insert(std::make_pair(1.1, 1));
    map1.insert(std::make_pair(string1, mapsub));
    return 0;
}

或者,另一种选择是:
#include <iostream>
#include <map>
#include <string>

int main() {
    std::map<std::string, std::map<float, int> > map1;
    std::string string1 = "alpha";
    map1.insert(std::make_pair(string1, std::map<float,int>{std::make_pair(1.1,1)}));
    return 0;
}

2

或者您可以使用以下方式的 [] 运算符:

map1[string1][1.1] =  1;

我不确定这是否有效,所以在发布之前我在Visual Studio中尝试了一下。不过还是谢谢! :) - benipalj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接