如何根据对的第二个元素对向量对进行排序?
如果我有一个对向量:
std::vector<std::pair<int, int> > vec;
是否有简单的方法可以根据对的第二个元素按递增顺序对列表进行排序?
我知道我可以编写一个小函数对象来完成这项工作,但是有没有办法使用 STL 和 std::less
的现有部分来完成这项工作直接地?
编辑:我知道我可以编写一个单独的函数或类来传递给第三个参数进行排序。 问题是我是否可以用标准的东西来构建它。 我真的想要看起来像这样的东西:
std::sort(vec.begin(), vec.end(), std::something_magic<int, int, std::less>());
If I have a vector of pairs:
std::vector<std::pair<int, int> > vec;
Is there and easy way to sort the list in increasing order based on the second element of the pair?
I know I can write a little function object that will do the work, but is there a way to use existing parts of the STL and std::less
to do the work directly?
EDIT: I understand that I can write a separate function or class to pass to the third argument to sort. The question is whether or not I can build it out of standard stuff. I'd really something that looks like:
std::sort(vec.begin(), vec.end(), std::something_magic<int, int, std::less>());
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(7)
编辑:使用 c++14,最好的解决方案非常容易编写,这要归功于 lambda 表达式现在可以具有
auto
类型的参数。 这是我目前最喜欢的解决方案原始答案:
只需使用自定义比较器(它是
std::sort
的可选第三个参数),如果您'正在使用 C++11 编译器,您可以使用 lambda 编写相同的内容:
编辑:为了响应您对问题的编辑,这里有一些想法...
如果您真的想要发挥创意并能够多次重用这个概念,只需制作一个模板:
那么您也可以这样做:
或者甚至
虽然说实话,这有点矫枉过正,只是编写 3 行函数并完成它:-P
EDIT: using c++14, the best solution is very easy to write thanks to lambdas that can now have parameters of type
auto
. This is my current favorite solutionORIGINAL ANSWER:
Just use a custom comparator (it's an optional 3rd argument to
std::sort
)If you're using a C++11 compiler, you can write the same using lambdas:
EDIT: in response to your edits to your question, here's some thoughts ...
if you really wanna be creative and be able to reuse this concept a lot, just make a template:
then you can do this too:
or even
Though to be honest, this is all a bit overkill, just write the 3 line function and be done with it :-P
你可以像这样使用 boost:
我不知道一个标准的方法来做到这一点同样简短,但你可以抓住
boost::bind
它全部由标头组成。You can use boost like this:
I don't know a standard way to do this equally short and concise, but you can grab
boost::bind
it's all consisting of headers.它非常简单
您使用算法中的排序函数并添加自己的比较函数
现在您必须根据第二个选择进行比较
所以将你的“myComparison”声明为
Its pretty simple
you use the sort function from algorithm and add your own compare function
Now you have to make the comparison based on the second selection
so declare you "myComparison" as
在 C++0x 中,我们可以使用 lambda 函数:
在本例中,返回类型 bool 是隐式推导的。
Lambda 返回类型
当 lambda 函数只有一条语句且这是一个 return 语句时,编译器可以推断出返回类型。 来自 C++11,第 5.1.2/4 节:
要显式指定返回类型,请使用
[]() -> 形式 输入 { }
,例如:With C++0x we can use lambda functions:
In this example the return type
bool
is implicitly deduced.Lambda return types
When a lambda-function has a single statement, and this is a return-statement, the compiler can deduce the return type. From C++11, §5.1.2/4:
To explicitly specify the return type use the form
[]() -> Type { }
, like in:对于可重复使用的东西:
您可以将其用作
或
For something reusable:
You can use it as
or
您必须依赖非标准 select2nd
You'd have to rely on a non standard select2nd
尝试交换对的元素,以便可以正常使用
std::sort()
。Try swapping the elements of the pairs so you can use
std::sort()
as normal.