【问题标题】:request for member 'append' in 'a' , which is of non class type 'int'在 'a' 中请求成员 'append' ,它是非类类型 'int'
【发布时间】:2019-10-18 12:04:11
【问题描述】:

我是编程新手,所以我的怀疑可能很愚蠢。 所以当我试图解决一个挑战时,我必须从数组中的数字中形成最大的数字。 所以我创建了一个比较函数并传递给排序函数。在比较函数中,我检查 a+b 是否大于 b+a,反之亦然。 但编译器显示错误说明请求成员非类类型。

我实际上不知道如何解决这个问题,我尝试了谷歌搜索但没有得到我的解决方案。 我找到了类似的解决方案,但他们是用字符串做的。可以用数组来完成吗?

int myCompare( int a, int b){


    int ab= a.append(b);
    int ba= b.append(a);

    if(ab>ba){
        return 1;
    }else{
        return 0;
    }

}

void biggestnum(int arr[], int n){

    if(n==0 || n==1){
        return;
    }

    sort(arr,arr+n, myCompare);

    for(int i=0;i<n;i++){
        cout<<arr[i]<<" ";
    }
    cout<<endl;
}

所以如果给定的数组是 {54, 546, 548, 60}; 结果应该是 6054854654。

【问题讨论】:

  • 如果你不明白为什么你不能在原始类型上使用成员函数(比如int),那么你需要回到你的教科书、教程或课程,因为你有一些东西错过了。
  • int ab= a.append(b); 应该做什么?

标签: c++ arrays algorithm max unsigned-integer


【解决方案1】:

标量基本类型int 没有方法。所以这些记录

a.append(b);
b.append(a);

无效。

似乎使用了这样的结构

a.append(b)

您正在尝试将整数转换为std::string 类的对象。但是,如果 abstd::string 类型的对象,则将一个对象附加到另一个对象是没有意义的。比较原始字符串就足够了。

看来您要达到的目标如下

#include <iostream>
#include <string>
#include <iterator>
#include <algorithm>

bool myCompare( unsigned int a, unsigned int b )
{
    std::string s1 = std::to_string( a );
    std::string s2 = std::to_string( b );

    auto n = std::minmax( { s1.size(), s2.size() } );

    int result = s1.compare( 0, n.first, s2, 0, n.first );

    return ( result > 0 ) || 
           ( result == 0 && 
           ( ( s1.size() < n.second && s2[n.first] < s1[0] ) || 
             ( s2.size() < n.second && s2[0] < s1[n.first] ) ) );
}    

int main() 
{
    unsigned int a[] = { 54, 546, 548, 60 };

    std::sort( std::begin( a ), std::end( a ), myCompare );

    std::string s;

    for ( const auto &item : a )
    {
        s += std::to_string( item );
    }

    unsigned long long int value = std::stoull( s );

    std::cout << "The maximum number is " << value << '\n';

    return 0;
}

程序输出是

The maximum number is 6054854654

如果结果数字太大而无法放入 unsigned long long int 类型的对象中,则可以删除该语句

    unsigned long long int value = std::stoull( s );

并将结果字符串输出为

    std::cout << "The maximum number is " << s << '\n';

【讨论】:

  • 我认为您错过了赋值的目的,即在数组中找到的所有数字中找到最大的词法连接。仅按每个元素的数值大小对数组进行排序并不一定能实现这一点。再说一次,据我所知,OP的解决方案也没有!
  • 您提出的单次乘以十的解决方案似乎也不正确。正如问题的散文所暗示的那样,如果每个元素都只有一位数,但给定的示例数据会打折。
  • @LightnessRacesinOrbit 从问题中可以看出,有一个数字数组需要按降序排序,仅此而已。
  • 配合它的字面意思是“给定的数组是{54, 546, 548, 60}
  • @LightnessRacesinOrbit 哦,我没注意这个。:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多