How can I sort this vector by comparing the pair.first which is an std::string? (without providing a static compare function, nor use boost).
5 Answers
std::vector<std::pair<std::string, bool> > v;
std::sort(v.begin(), v.end());
std::pair overloads operator< to sort first by the first element then by the second element. Thus, if you just sort the vector using the default sort ordering (operator<), you'll get your desired ordering.
5 Comments
>> token closing two nested template <> pairs is C++0x only).>>.std::pair::operator<() was overloaded. I do now!< defined. If the second type is not sortable then this will fail.bool as its second element type, which is comparable.I really like James' answer, but there's one other option you might want to consider - just funnel everything into a std::map:
std::map<std::string, bool> myMap(v.begin(), v.end());
Or, if you have duplicate strings, a std::multimap:
std::multimap<std::string, bool> myMultiMap(v.begin(), v.end());
This does have the added advantage that if you then need to add or remove new key/value pairs, you can do so in O(lg n), as opposed to O(n) for the sorted vector.
If you really must use a vector, then go with James' answer. However, if you have a vector of pairs, there's a good chance that you really want a std::map.
Answer to "duplicate question" of this: link: 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
Comments
You can use a custom comparator to order on the pairs' .first only.
sort(begin, end,
compose2(less<string>(),
select1st<pair<string, bool> >(),
select1st<pair<string, bool> >()));
2 Comments
select1st is not part of the C++ Standard Library.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;} };You don't need to provide any compare function since by default since the sort() function will sort vector in ascending order of values. As each element is a pair, so one pair will be smaller than other one if the first value of one pair is smaller than that for other pair.
vector<pair<string,int>>v;
v = {{"xyz",1},{"pq",2}}; // Sample input
sort(v.begin(),v.end()); // Requires #include<algorithm> header