You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++按首字符排序字符串数组出现编译错误如何修复

问题修复方案

错误原因

编译错误的核心问题有两个:

  • 你声明的str是长度为3的C风格原生数组,不属于STL容器类,没有内置的begin()、end()成员方法,所以调用str.begin()会直接编译失败。
  • 你写的compare1函数是C标准库qsort对应的比较器写法,不符合C++ std::sort的比较器参数要求,就算解决了迭代器问题后续也会报错。

修复方案

这里提供两种可行的修改方式:

方案1:保留原生数组,修改迭代器传入方式和比较器

直接给std::sort传入数组首地址和尾地址,同时重写符合要求的比较器,修改后的完整代码如下:

#include<bits/stdc++.h>
using namespace std;

// std::sort的比较器直接接收两个元素类型的参数即可,不需要void*,用const引用可避免不必要的字符串拷贝
bool compare1(const string& c, const string& d)
{
    return c[0] < d[0];
}

int main()
{
    string str[3];
    int i;
    
    for(i=0;i<3;i++)
    {
        cout<<"Enter "<<i+1<<" string: ";
        cin>>str[i];
    }
    
    cout<<"Before sort"<<endl;
    for(i=0;i<3;i++)                               
    {
        cout<<str[i]<<" ";
    }
    cout<<endl;
    
    // 原生数组直接传首地址和首地址+长度作为迭代器范围
    // C++11及以上标准也可以写为sort(std::begin(str), std::end(str), compare1); 不需要手动计算数组长度
    sort(str, str + 3, compare1);
    
    cout<<"After sort"<<endl;
    for(i=0;i<3;i++)
    {
        cout<<str[i]<<" ";
    }
    return 0;
}

方案2:把原生数组替换为STL容器

如果想保留begin()、end()的写法,可以把数组替换为STL的std::array或std::vector容器,示例如下:

#include<bits/stdc++.h>
using namespace std;

bool compare1(const string& c, const string& d)
{
    return c[0] < d[0];
}

int main()
{
    // 替换为固定长度的std::array容器
    array<string, 3> str;
    int i;
    
    for(i=0;i<3;i++)
    {
        cout<<"Enter "<<i+1<<" string: ";
        cin>>str[i];
    }
    
    cout<<"Before sort"<<endl;
    for(i=0;i<3;i++)                               
    {
        cout<<str[i]<<" ";
    }
    cout<<endl;
    
    // 容器自带begin、end成员方法
    sort(str.begin(), str.end(), compare1);
    
    cout<<"After sort"<<endl;
    for(i=0;i<3;i++)
    {
        cout<<str[i]<<" ";
    }
    return 0;
}

内容的提问来源于stack exchange,提问作者Hash include

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 23:54:02