如何按值实现STL地图排序?
例如,我有一张地图m:
map<int, int> m;
m[1] = 10;
m[2] = 5;
m[4] = 6;
m[6] = 1;
Run Code Online (Sandbox Code Playgroud)
我想按照m价值对地图进行排序.所以,如果我打印地图,我想得到如下结果:
m[6] = 1
m[2] = 5
m[4] = 6
m[1] = 10
Run Code Online (Sandbox Code Playgroud)
我怎样才能以这种方式对地图进行排序?有什么方法可以用排序值处理键和值吗?
请看一下Johannes Schaub发布的这个例子来排序对的向量:
std::sort(a.begin(), a.end(),
boost::bind(&std::pair<int, int>::second, _1) <
boost::bind(&std::pair<int, int>::second, _2));
Run Code Online (Sandbox Code Playgroud)
我以为我确实理解了boost :: bind,但我遇到了这个问题.
问题1:
排序算法期望谓词函数作为第三个参数.我在这里看到的是一个布尔表达式.我错过了什么?:
boost::bind(&std::pair<int, int>::second, _1) < boost::bind(&std::pair<int, int>::second, _2)
Run Code Online (Sandbox Code Playgroud)
对于那两个绑定,boost :: bind库是否重载operator <并且正在返回某种函数指针(如lambda)?
问题2:
这让我感到困惑:
boost::bind(&std::pair<int, int>::second, _1)
Run Code Online (Sandbox Code Playgroud)
通常有一些函数指针作为绑定调用的第一个参数,但是这里是一个类成员的地址?特定绑定的结果是什么?
感谢您的时间和帮助
我正在阅读StackOverFlow帖子,关于通过该对的第二个元素对对矢量进行排序.最明显的答案是创建一个谓词,但是一个使用boost的答案引起了我的注意.
std::sort(a.begin(), a.end(),
boost::bind(&std::pair<int, int>::second, _1) <
boost::bind(&std::pair<int, int>::second, _2));
Run Code Online (Sandbox Code Playgroud)
我一直试图弄清楚boost :: bind是如何工作的,或者至少是如何使用它,但是我无法弄清楚占位符参数_1和_2的用途是什么,而且boost文档没有陷入困境.
谁能解释一下boost :: bind的具体用法?
PS原始问题:如何根据对的第二个元素对对矢量进行排序?
我正在应对编程挑战,在提出问题之前我已经看过这个主题:
情况是这样的:
-我有我的向量对:vector< pair<int, int> > rank;
-我已经实现了一个谓词来按第二个元素并按降序对成对的向量进行比较和排序:
struct predicate
{
bool operator()(const std::pair<int, int> &left, const std::pair<int, int> &right)
{
return left.second < right.second;
}
}
sort(rank.rbegin(), rank.rend(), predicate());
Run Code Online (Sandbox Code Playgroud)
编程挑战将为第二个元素提供重复的值,在这种情况下,我必须将第一个元素按其插入向量对的时间排序,例如:
电压 1 3 2 4 4 5 33 3
排序必须是:
4 5 2 4 1 3 33 3
当我用我设计的测试用例测试我的解决方案时,问题就出现了:
电压 1 2 16 3 11 2 20 3 18 2 39 39 23 22 12 19 123 4 145 6 3 5 26 4 9574 4 …
嘿所有我都有一对矢量.在对矢量进行排序之后(即sort(v.begin(),v.end())......它在第一个元素的基础上对元素进行排序,但是我有一个问题......因为我需要保持第二个元素的顺序,第一个元素是相同的顺序. .例如看下面的代码..
std::vector<std::pair<int, int> > v(2);
v[0].first = 1; v[1].first = 1;
v[0].second = 2; v[1].second = 0;
sort(v.begin(),v.end());
for (int i = 0; i < 2; i++)
{
std::cout << v[i].first << " " << v[i].second << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
作为上述代码的输出是
1 0
1 2
Run Code Online (Sandbox Code Playgroud)
而我希望输出如下
1 2
1 0
Run Code Online (Sandbox Code Playgroud)
请帮忙 !!
我想创建一个类,调用它MyClass有三个数据成员a,b和c.然后我希望将许多MyClass对象放入a中std::Vector<MyClass>,然后根据数据成员对Vector进行排序.
使用STL有一种优雅的方式吗?我不想重新发明轮子,我相信这不是第一次.在Java中我想我会使用Comparator.
vector<pair<int,int> > v;
for(i=0;i<5;i++){
cin>>b>>c;
v.push_back(make_pair(b,c));
}
sort(v.begin(),v.end());
Run Code Online (Sandbox Code Playgroud)
是否可以为排序函数编写一个比较器,以便v[i].first按升序排序,并且对于 的相似值v[i].first,v[i].second按降序排序?
像:-
i/p:
13 10
44 15
13 15
13 99
6 45
Run Code Online (Sandbox Code Playgroud)
输出:
6 45
13 99
13 15
13 10
44 15
Run Code Online (Sandbox Code Playgroud) c++ ×7
sorting ×4
stl ×3
vector ×3
std-pair ×2
algorithm ×1
boost ×1
boost-bind ×1
comparator ×1
dictionary ×1