【发布时间】:2021-10-30 18:03:04
【问题描述】:
我正在阅读 C++ 中的字符串和函数指针。在那里,我发现了一个基于第一个字符值的字符串排序数组。 这是我的代码解决方案。
#include<bits/stdc++.h>
using namespace std;
bool compare1(const void *a, const void *b)
{
string c = *(string *)a;
string d = *(string *)b;
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;
sort(str.begin(),str.end(),compare1);
cout<<"After sort"<<endl;
for(i=0;i<3;i++)
{
cout<<str[i]<<" ";
}
return 0;
}
但我收到编译时错误:[Error] 请求“str”中的成员“begin”,它属于非类类型“std::string [3] {aka std::basic_string [ 3]}'
如何解决这个问题?
【问题讨论】:
-
您似乎将 C 库的
qsort与 C++ 库的std::sort混淆了。 -
与您的问题无关,但您可以使用 lambda 来简化您的代码:
std::sort(std::begin(str), std::end(str), [](const std::string& s1, const std::string& s2) { return s1[0] < s2[0]; }); -
看起来您几乎是在从所谓的“竞赛”或“在线评委”网站学习编程和 C++。不要那样做,那不是他们的目的。获取some good books 阅读并参加一些课程。您需要这样做,因为您的代码中有多个基本错误。
-
你不应该使用
void*,尤其是当方法只有在string*s 被传递时才能正常工作(虽然你首先不需要指针) -
除了实际答案之外,如果您不想等待分段错误,您应该确保您的比较函数还检查字符串是否真的有第一个元素。
标签: c++ string sorting string-comparison function-definition