有没有办法比较c ++中std :: set的两个连续元素?

时间:2016-12-13 18:12:06

标签: c++ set

我正在使用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来执行我想要的操作吗?如果有人可以提供帮助,那就太棒了。

1 个答案:

答案 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)