C 排序无法排序一组字符串

C++ sort cannot sort set of strings?

本文关键字:排序 一组 字符串      更新时间:2023-10-16

我想知道如何对包含字符串的集合进行排序。例如,我有一个:

std::set<std::string> setA = {"B","A","C"}

然后我想用它来进行分类:

std::sort(setA.begin(),setA.end());

但是C 编译器无法通过。错误消息报告:

40: error: invalid operands to binary expression
('std::__1::__tree_const_iterator<std::__1::basic_string<char>, std::__1::__tree_node<std::__1::basic_string<char>, void *> *, long>'
and 'std::__1::__tree_const_iterator<std::__1::basic_string<char>, std::__1::__tree_node<std::__1::basic_string<char>, void *> *, long>')
difference_type __len = __last - __first;

然后,我在C 中重新检查函数,看来它只能处理int,double,long ...但是无法使用此函数sort()对字符串进行排序。

那么我该如何排序字符串?

std :: stort需要随机访问 iterators std :: set 仅提供 biDirectional iterators。

一般来说,任何试图对 std :: Set 进行排序与此容器的设计相矛盾,因为它以排序顺序存储其元素。

来自cppreference.com:

std :: set是一个关联容器,包含排序集合 类型键的唯一对象。

您无法求助于集合,它如何分类是特定集合类型的一部分。给定的集合具有无法更改的固定设置顺序。

您可以相对容易地创建具有相同数据的新集合。只需创建一个基于新标准的新集合即可。

如果要在同一代码中使用两组,则必须抽象对基础集的访问。

使用std :: sorts sorts sorts进行分类集。更改您的容器。

您只是insert这三个字符串,如果您使用std::set

,它们已经对它们进行排序
set<string> s;
s.insert("A");
...
OR
set<string> str = {"A", "B", "C", "D"}; //C++ 11
OR
string s[] = {"A", "B", "C", "D"};
set<string> str(s, s+ sizeof(s) / sizeof(s[0]));
And they are sorted.

如果您想要自定义排序(您可能是您的?)

然后使用vector<string>()sort()

bool cmp(string a, string b)
{
    // do something and return boolean
}
vector<string> v;
v.push_back("s");
...
sort(v.begin(),v.end(),cmp);

顺便说一句,您无法求解set,因为其元素的排序完全取决于集合的标准实现,如C 。