我正在使用Codeblocks-13.12和C ++语言。我想使用迭代器比较一组的两个连续元素。但编译器给出了错误。我尝试了这一点,因为我没有通过足够的谷歌搜索获得任何信息。如果有可能,那就太棒了。
我正在处理的问题陈述很简单。我给了一个数组。我必须打印一个整数,最大元素数使得任意两个整数之间的绝对差值为< = 1.答案必须是> = 2.
我已经使用数组和设置100%正确地解决了这个问题。比较set的两个值,我无法使用set,我使用数组完成了那个部分。但是如果这部分可以使用std :: set来完成,那么它将是太令人惊讶和有利。 使用set和array的代码是 -
#include <bits/stdc++.h>
#define for0(i,n) for(int i=0;i<n;i++)
#define inf 100000000
using namespace std;
int a[103];
map<int,int> mp;
set<int> st;
set<int>::iterator it;
int main()
{
int n,maxi=-inf,x;
scanf("%d",&n);
for0(i,n) {scanf("%d",&a[i]);mp[a[i]]++;st.insert(a[i]);}
if(sz(st)==1){ pf("%d\n",mp[a[0]]);return 0;}
for (it=st.begin(); it!=st.end(); ++it)
{
if(mp[*it]>1)
{
x=mp[*it];
if(x>maxi) maxi=x;
}
}
sort(a,a+n);
for(int i=0;i<n-1;i++)
{
if(a[i]!=a[i+1] && a[i+1]-a[i]==1)
{
int x=mp[a[i]]+mp[a[i+1]];
if(x>maxi) maxi=x;
}
}
if(maxi==-inf) printf("0\n");
else printf("%d\n",maxi);
return 0;
}
此代码是100%正确的解决方案。但是我希望使用set来做数组部分 - 比较两个连续的元素。我尝试过的代码是 -
#include <bits/stdc++.h>
#define for0(i,n) for(int i=0;i<n;i++)
#define inf 100000000
using namespace std;
int a[103];
map<int,int> mp;
set<int> st;
set<int>::iterator it;
int main()
{
int n,maxi=-inf,x;
scanf("%d",&n);
for0(i,n) {scanf("%d",&a[i]);mp[a[i]]++;st.insert(a[i]);}
if(sz(st)==1){ pf("%d\n",mp[a[0]]);return 0;}
for (it=st.begin(); it!=st.end(); ++it)
{
if(mp[*it]>1)
{
x=mp[*it];
if(x>maxi) maxi=x;
}
if(it + 1 != st.end() && *(it + 1)-*it==1)
{
x=mp[*it]+mp[*(it + 1)];
if(x>maxi) maxi=x;
}
}
if(maxi==-inf) printf("0\n");
else printf("%d\n",maxi);
return 0;
}
所有代码都与上面相同,只不过我在&#34;内添加&#34;集循环 -
if(it + 1 != st.end() && *(it + 1)-*it==1)
{
x=mp[*it]+mp[*(it + 1)];
if(x>maxi) maxi=x;
}
而不是数组部分 -
sort(a,a+n);
for(int i=0;i<n-1;i++)
{
if(a[i]!=a[i+1] && a[i+1]-a[i]==1)
{
int x=mp[a[i]]+mp[a[i+1]];
if(x>maxi) maxi=x;
}
}
在由&#34;组成的行中if(it + 1!= st.end()&amp;&amp; *(it + 1) - * it == 1)&#34; - 这里我收到了错误 - &#34;运营商+没有匹配&#39;它+ 1&#39; &#34 ;.所以,这种方式不正确。但我想知道有什么方法可以使用set来执行我想要的操作吗?如果有人可以提供帮助,那就太棒了。
答案 0 :(得分:2)
缩小形式的问题:
set<int> st;
set<int>::iterator it;
for (it=st.begin(); it!=st.end(); ++it)
{
if(it + 1 != st.end() && *(it + 1)-*it==1) { // << error
//do something
}
}
编译器错误no match for operator+ in 'it + 1'
不言自明。相反,您应该使用next:
if(next(it) != st.end() && *(next(it))-*it==1)