微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

对C ++地图的map.find的实现错误

如何解决对C ++地图的map.find的实现错误

我有这样的地图

map<int,pair<int,int>>diff;

我正在这样使用它

int temp;
    for(int i=0;i<n-1;i++)
    {
        for(int j=i+1;j<n;j++)
        {
            temp=v[j]-v[i];
            if(temp>0)
            {
                if(diff.find(temp)!=diff.end())
                {
                    pair<int,int> a=diff.find(temp);
                    if(a.second>j)
                    {
                        a.second=j;
                        a.first=i;
                    }
                }
                else
                {
                    map.insert({temp,{i,j}});
                }
            }
        }
    }    

其中n是向量v的大小。

我得到的错误

error: conversion from ‘std::map<int,std::pair<int,int> >::iterator {aka std::_Rb_tree_iterator<std::pair<const int,int> > >}’ to non-scalar type ‘std::pair<int,int>’ requested

pair<int,int> a=diff.find(temp);

我在网上看了看,发现如果element存在,则map.find()返回向量中element的位置,因此在这种情况下,该对应该返回到正确的element上?

我在做什么错了?

解决方法

错误消息确切说明了错误所在。您正在尝试使用pair<int,int>初始化decltype(diff)::iterator

简单的解决方法是取消引用find的结果,或使用at

pair<int,int> a=diff.at(temp);

请注意,这是副本,而不是引用,因此以下操作将被丢弃。

更好的解决方法是使用第一个find

中的迭代器
auto it = diff.find(temp);
if(it!=diff.end())
{
    if(it->second>j)
    {
        it->second=j;
        it->first=i;
    }
}
else
{
    map.insert({temp,{i,j}});
}

请注意,map::insert返回一个有用的值,并且不会覆盖现有值。您可以进一步简化:

auto [it,unused] = map.insert({temp,j}});
if (it->second < j)
{
    it->second=j;
    it->first=i;
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。