我想知道如何对包含字符串的集合进行排序。例如,我有一套:
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()
来排序字符串。
那么如何对字符串进行排序?
答案 0 :(得分:4)
std::sort需要随机访问迭代器,而 std :: set 仅提供双向迭代器。
一般来说,任何尝试对 std :: set 进行排序都与此容器的设计相矛盾,因为它以排序顺序存储其元素。
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 ++中设定的标准实现。