C ++排序不能对字符串集进行排序?

时间:2017-01-01 16:17:10

标签: c++ sorting c++11 set std

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

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 ++中重新检查sort函数,它似乎只能处理int,double,long ......但是没有办法使用这个函数sort()来排序字符串。

那么如何对字符串进行排序?

3 个答案:

答案 0 :(得分:4)

std::sort需要随机访问迭代器,而 std :: set 仅提供双向迭代器。

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

来自cppreference.com

  

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

答案 1 :(得分:0)

你不能诉诸一个集合,它如何排序是特定集合类型的一部分。给定集合具有无法更改的固定集合顺序。

您可以相对轻松地创建具有相同数据的新集。只需创建一个基于新标准进行排序的新集。

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

Sorting Sets using std::sort无耻地复制。改变你的容器。

答案 2 :(得分:0)

您只需textscan这三个字符串,如果您使用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); ,因为它的元素排序完全取决于c ++中设定的标准实现。