【问题标题】:Set key and value of a map* in C++在 C++ 中设置 map* 的键和值
【发布时间】:2013-01-25 02:04:30
【问题描述】:

我关注http://www.cplusplus.com/reference/map/map/map/

我正在尝试构建一个反向索引结构,它是一个以 64 位整数作为键的映射,每个键都将保存一个指向子映射的指针。子映射将包含 int int 对。所以我让自己写了一些示例:

map<unsigned long long int, map<int, int>*> invertID;

int main(int argc, char *argv[]){

    map<int,int>* m = new map<int,int>();

    m[10] = 1;

    invertID[1] = m;

    return 0;

}

但是对于像这样的非指针类型的映射来说,这通常是个问题

std::map<char,int> first;

http://www.cplusplus.com/reference/map/map/map/中所述,我知道我们可以做到

first['a']= 10;

但是如果我们有一个map的指针类型,我们该怎么做呢?我上面的代码会产生一个错误提示

error C2679: binary '=' : no operator found which takes a right-hand operand of type 'int' (or there is no acceptable conversion)

【问题讨论】:

    标签: c++ pointers map


    【解决方案1】:

    您可以取消引用指针:

     (*m)[10] = 1;
    

    m->operator[](10) = 1;
    

    另一方面,您真的需要所有这些指针吗?你的程序会因为使用这种形式而受到很大的影响吗?

    map<unsigned long long int, map<int, int>> invertID;
    int main()
    {
        map<int,int> m;
        invertID[1][10] = 1;
    }
    

    【讨论】:

    • 等等,所以你建议我只将子地图插入地图,而不是作为指针?如果我以后想修改这个子地图怎么办?这是否意味着,在二进制中,程序必须创建此子图的副本,更改一些值,并用修改后的子图副本替换主图中的原始子图?有性能损失吗?
    • @Karl 你只需通过invertID[index] 访问它。我添加了一个示例。
    【解决方案2】:

    Map 是一棵红黑树,用于操作,因此您可以使用它来获得搜索和插入等的最佳性能。您在 invertID 中使用的是地图而不是多地图。因此,在大多数情况下,当您获取某些密钥时,我会假设您正在寻找一对元素。除非您出于我现在没有想到的任何原因需要第二张地图,否则我会这样做:

    std::map < unsigned long long int, std::pair < int , int >  > invertID;
    int main(){
        std::pair<int,int>  m;
        m = std::make_pair(1,2);
        invertID[1] = m;
        return 0;
    }
    

    玩得开心。

    【讨论】:

    • 子图用于统计文档ID(也是整数)的频率(整数)。
    • 然后去配对,更容易,更快捷。并在我被屏蔽时投票给我
    • 但每个文档 ID 的频率会在运行时递增。我们也可以修改pair的值吗?
    • 当然。带有 .first 和 .second 成员函数。帮您检查一下:pastebin.com/kjd7cvZW
    • 我在cplusplus.com/reference/utility/pair 仔细查看了pair,我发现一对将只包含两个值。看来我的解释一开始并没有那么好。我在map中使用map的原因是因为在invert index的每个索引中,在某些情况下它可能持有超过1对。
    猜你喜欢
    • 1970-01-01
    • 2011-10-28
    • 2017-08-30
    • 2015-07-24
    • 2012-04-12
    • 1970-01-01
    • 2013-07-18
    • 1970-01-01
    • 2014-09-02
    相关资源
    最近更新 更多