【发布时间】:2011-06-04 08:36:31
【问题描述】:
我如何通过比较pair.first 这是std::string 来排序这个vector? (不提供静态比较功能,也不使用 boost)。
【问题讨论】:
标签: c++ sorting stl vector std-pair
我如何通过比较pair.first 这是std::string 来排序这个vector? (不提供静态比较功能,也不使用 boost)。
【问题讨论】:
标签: c++ sorting stl vector std-pair
std::vector<std::pair<std::string, bool> > v;
std::sort(v.begin(), v.end());
std::pair 重载operator< 以首先按first 元素排序,然后按second 元素排序。因此,如果您只使用默认排序顺序 (operator<) 对 vector 进行排序,您将获得所需的顺序。
【讨论】:
>> 标记关闭两个嵌套模板 <> 对仅适用于 C++0x)。
>>的编译器了。
std::pair::operator<() 已超载。我现在做!
< 定义。如果第二种类型不可排序,那么这将失败。
bool 作为它的第二个元素类型,这是可比较的。
您可以使用自定义比较器仅对配对的.first 进行排序。
sort(begin, end,
compose2(less<string>(),
select1st<pair<string, bool> >(),
select1st<pair<string, bool> >()));
【讨论】:
select1st 不是 C++ 标准库的一部分。
template<class T> struct select1st : public unary_function<T, typename T::first_type> { const typename T::first_type& operator()(const T& x) const {return x.first;} };
我真的很喜欢 James 的回答,但您可能还想考虑另一种选择 - 只需将所有内容汇集到 std::map:
std::map<std::string, bool> myMap(v.begin(), v.end());
或者,如果你有重复的字符串,std::multimap:
std::multimap<std::string, bool> myMultiMap(v.begin(), v.end());
这确实有一个额外的优势,如果您随后需要添加或删除新的键/值对,您可以在 O(lg n) 中执行此操作,而不是排序向量的 O(n)。
如果您真的必须使用向量,那么请使用 James 的答案。但是,如果您有一个成对向量,那么您很有可能真的想要一个 std::map。
【讨论】:
回答“重复问题”: 链接:Sort a vector of pairs by first element then by second element of the pair in C++?
bool cmp(const pair<int,int>&x,const pair<int,int>y){
if(x.first==y.first){
return(x.second<y.second);
}
return(x.first<y.first);
}
array of pairs before:
5 2
4 2
8 2
8 3
8 1
array of pairs after:
4 2
5 2
8 1
8 2
8 3
【讨论】:
您不需要提供任何比较函数,因为默认情况下 sort() 函数将按值的升序对向量进行排序。由于每个元素都是一对,所以如果一对的第一个值小于另一对的第一个值,则一对将小于另一对。
vector<pair<string,int>>v;
v = {{"xyz",1},{"pq",2}}; // Sample input
sort(v.begin(),v.end()); // Requires #include<algorithm> header
【讨论】: