按特定数据成员对结构的 STL 容器进行排序
Sort an STL container of structs by a certain data member
我知道使用 C++11 会更简单,但是有没有办法让它在 C++98 中工作?我有以下示例代码:
#include <boost/lambda/lambda.hpp>
#include <boost/lambda/bind.hpp>
#include <vector>
#include <algorithm>
#include <iostream>
struct foo {
foo(const int a_, const double b_): a(a_), b(b_) {}
int a;
double b;
};
std::ostream &operator<<(std::ostream &out, const foo &f)
{
out << f.a << ',' << f.b;
return out;
}
#define DO_SORT(CONTAINER, TYPE, MEMBER)
std::sort(CONTAINER.begin(), CONTAINER.end(), boost::lambda::bind(&TYPE::MEMBER, boost::lambda::_1) > boost::lambda::bind(&TYPE::MEMBER, boost::lambda::_2));
int main()
{
std::vector<foo> v;
v.push_back(foo(1, -2.0));
v.push_back(foo(3, -3.0));
v.push_back(foo(2, -1.0));
std::cout << "Original" << std::endl;
std::for_each(v.begin(), v.end(), std::cout << boost::lambda::_1 << "n");
std::cout << "Sort by a" << std::endl;
DO_SORT(v, foo, a);
std::for_each(v.begin(), v.end(), std::cout << boost::lambda::_1 << "n");
std::cout << "Sort by b" << std::endl;
DO_SORT(v, foo, b);
std::for_each(v.begin(), v.end(), std::cout << boost::lambda::_1 << "n");
}
这样可以完成工作,但需要指定容器内部的类型。我正在寻找一种能够写DO_SORT(v, a)
的方法.我尝试用BOOST_TYPEOF(CONTAINER)::value_type
替换宏中的TYPE
,但编译器不喜欢这样。
有没有办法在 C++98 中执行此操作而无需指定类型?此外,如果有某种方法可以减少甚至删除 C++98 中宏的使用,那也很棒。
您可以使用模板参数推导和指向成员变量的指针来消除宏并获取类型:
template <typename C, typename T, typename R>
void do_sort(C& container, R T::*mem) {
std::sort(
container.begin(), container.end(),
boost::lambda::bind(mem, boost::lambda::_1) >
boost::lambda::bind(mem, boost::lambda::_2));
}
然后使用语法调用
do_sort(v, &foo::a);
因此,这将实例化:
void do_sort(std::vector<foo>& container, int foo::*mem);
T
将推断出foo
,R
将推断出声明为的任何foo::a
,以便为指向成员的指针参数生成正确的类型。 旁注:我会将这个函数命名为sort_by
。 一般的做法也是使用 <
而不是 >
进行排序,但如果你想要降序值,那么这就是要走的路。
为了完整起见,以下是我在 C++11 中实现它的方式
template <typename C, typename T, typename R>
void sort_by(C& container, R T::*mem) {
std::sort(std::begin(container), std::end(container),
[mem](const T& lhs, const T& rhs) {return lhs.*mem > rhs.*mem;} );
}
您只是将其用作一般情况的示例,还是这样的事情会起作用?
#include <iostream>
#include <vector>
#include <algorithm>
struct foo {
foo(const int a, const double b) : a(a), b(b) {}
int a;
double b;
};
bool compareA(const foo& foo1, const foo& foo2)
{
return foo1.a < foo2.a;
}
bool compareB(const foo& foo1, const foo& foo2)
{
return foo1.b < foo2.b;
}
int main()
{
std::vector<foo> v;
v.push_back(foo(1, -2.0));
v.push_back(foo(3, -3.0));
v.push_back(foo(2, -1.0));
std::cout << "Original" << std::endl;
for ( int i = 0; i < v.size(); i++ ) std:: cout << v[i].a << 'n';
std::cout << "Sort by a" << std::endl;
std::sort( v.begin(), v.end(), compareA );
for ( int i = 0; i < v.size(); i++ ) std:: cout << v[i].a << 'n';
std::cout << "Sort by b" << std::endl;
std::sort( v.begin(), v.end(), compareB );
for ( int i = 0; i < v.size(); i++ ) std:: cout << v[i].b << 'n';
}
相关文章:
- 使用2个键的cpp-stl::优先级队列排序不正确
- 在STL - C++中按成绩对学生列表进行排序?
- C++ STL 排序会检查 NaN 吗?
- 使用列表 STL 递归进行插入排序
- 如何使用 STL 排序对具有模板专用化的自定义类对象进行排序?
- 使用STL对用户输入数组进行排序的错误有什么解决方案吗?
- 如何根据对的第二个元素对 STL c++ 中的一组对进行排序?
- C++ wrt 字符串中的 STL 排序函数
- 如何检查队列是否使用 STL 排序
- STL按客户"<"运算符对向量进行排序。为什么要将"<"运算符定义为 const?
- C :STL STL阵列的STL排序
- STL 排序,保留原始顺序
- 列表STL的时间复杂性在一段时间内进行排序
- 为 STL 列表编写选择排序
- c ++ 是否有 STL 算法来检查范围是否严格排序
- 对 STL 容器进行排序
- 使用 stl::map 和 stl::unordered_map 对包含大量重复元素的数组数据进行排序
- 使用另一个stl向量重新排序stl向量
- 在两个值上排序STL向量
- 排序STL列表的子类