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
相关产品推荐
相关产品推荐

