问题描述
我有这样的地图
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;
}