对std :: vector <std :: pair <std :: string,bool>&gt;进行排序由字符串?</std :: pair <std :: string,bool>

时间:2011-01-05 23:17:47

标签: c++ sorting stl vector std-pair

如何通过比较vector pair.first来对std::string进行排序? (不提供静态比较功能,也不使用提升)。

4 个答案:

答案 0 :(得分:37)

std::vector<std::pair<std::string, bool> > v;
std::sort(v.begin(), v.end());

std::pair重载operator<首先按first元素排序,然后按second元素排序。因此,如果您只使用默认排序顺序(vector)对operator<进行排序,您将获得所需的排序。

答案 1 :(得分:3)

我真的很喜欢詹姆斯的答案,但还有一个你可能想要考虑的选择 - 只需将所有内容汇集到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)。

如果你真的必须使用矢量,那么请选择詹姆斯的回答。但是,如果您有一对配对,那么您很可能真的需要std::map

答案 2 :(得分:0)

您可以使用自定义比较器仅对.first对进行排序。

sort(begin, end,
     compose2(less<string>(),
              select1st<pair<string, bool> >(),
              select1st<pair<string, bool> >()));

答案 3 :(得分:0)

对此“重复问题”的答案: 链接: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