我想排序一个 vector
vector<myClass> object;
Run Code Online (Sandbox Code Playgroud)
其中myclass
包含许多int
变量.如何对我vector
的任何特定数据变量进行排序myClass
.
ava*_*kar 113
std::sort(object.begin(), object.end(), pred());
Run Code Online (Sandbox Code Playgroud)
其中,pred()
是一个定义对象上的顺序的函数对象myclass
.或者,您可以定义myclass::operator<
.
例如,您可以传递lambda:
std::sort(object.begin(), object.end(),
[] (myclass const& a, myclass const& b) { return a.v < b.v; });
Run Code Online (Sandbox Code Playgroud)
或者如果您坚持使用C++ 03,那么函数对象方法(v
是您要对其进行排序的成员):
struct pred {
bool operator()(myclass const & a, myclass const & b) const {
return a.v < b.v;
}
};
Run Code Online (Sandbox Code Playgroud)
Gab*_*abe 77
超载运算符,然后排序.这是我在网上发现的一个例子......
class MyData
{
public:
int m_iData;
string m_strSomeOtherData;
bool operator<(const MyData &rhs) const { return m_iData < rhs.m_iData; }
};
std::sort(myvector.begin(), myvector.end());
Run Code Online (Sandbox Code Playgroud)
来源:这里
Ste*_*sop 15
指向成员的指针允许您编写单个比较器,该比较器可以与您的类的任何数据成员一起使用:
#include <algorithm>
#include <vector>
#include <string>
#include <iostream>
template <typename T, typename U>
struct CompareByMember {
// This is a pointer-to-member, it represents a member of class T
// The data member has type U
U T::*field;
CompareByMember(U T::*f) : field(f) {}
bool operator()(const T &lhs, const T &rhs) {
return lhs.*field < rhs.*field;
}
};
struct Test {
int a;
int b;
std::string c;
Test(int a, int b, std::string c) : a(a), b(b), c(c) {}
};
// for convenience, this just lets us print out a Test object
std::ostream &operator<<(std::ostream &o, const Test &t) {
return o << t.c;
}
int main() {
std::vector<Test> vec;
vec.push_back(Test(1, 10, "y"));
vec.push_back(Test(2, 9, "x"));
// sort on the string field
std::sort(vec.begin(), vec.end(),
CompareByMember<Test,std::string>(&Test::c));
std::cout << "sorted by string field, c: ";
std::cout << vec[0] << " " << vec[1] << "\n";
// sort on the first integer field
std::sort(vec.begin(), vec.end(),
CompareByMember<Test,int>(&Test::a));
std::cout << "sorted by integer field, a: ";
std::cout << vec[0] << " " << vec[1] << "\n";
// sort on the second integer field
std::sort(vec.begin(), vec.end(),
CompareByMember<Test,int>(&Test::b));
std::cout << "sorted by integer field, b: ";
std::cout << vec[0] << " " << vec[1] << "\n";
}
Run Code Online (Sandbox Code Playgroud)
输出:
sorted by string field, c: x y
sorted by integer field, a: y x
sorted by integer field, b: x y
Run Code Online (Sandbox Code Playgroud)
与其他答案中解释的一样,您需要提供比较功能.如果你想保持该函数的定义接近于sort
调用(例如,如果它只对这种类型有意义),你可以在那里定义它boost::lambda
.使用boost::lambda::bind
调用成员函数.
例如,按成员变量或函数排序data1
:
#include <algorithm>
#include <vector>
#include <boost/lambda/bind.hpp>
#include <boost/lambda/lambda.hpp>
using boost::lambda::bind;
using boost::lambda::_1;
using boost::lambda::_2;
std::vector<myclass> object(10000);
std::sort(object.begin(), object.end(),
bind(&myclass::data1, _1) < bind(&myclass::data1, _2));
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
148339 次 |
最近记录: |