# Sorting a vector of custom objects

### Question

How does one go about sorting a vector containing custom (i.e. user defined) objects.
Probably, standard STL algorithm sort along with a predicate (a function or a function object) which would operate on one of the fields (as a key for sorting) in the custom object should be used.
Am I on the right track?

1
228
9/4/2009 5:05:37 PM

A simple example using `std::sort`

``````struct MyStruct
{
int key;
std::string stringValue;

MyStruct(int k, const std::string& s) : key(k), stringValue(s) {}
};

struct less_than_key
{
inline bool operator() (const MyStruct& struct1, const MyStruct& struct2)
{
return (struct1.key < struct2.key);
}
};

std::vector < MyStruct > vec;

vec.push_back(MyStruct(4, "test"));
vec.push_back(MyStruct(3, "a"));
vec.push_back(MyStruct(2, "is"));
vec.push_back(MyStruct(1, "this"));

std::sort(vec.begin(), vec.end(), less_than_key());
``````

Edit: As Kirill V. Lyadvinsky pointed out, instead of supplying a sort predicate, you can implement the `operator<` for `MyStruct`:

``````struct MyStruct
{
int key;
std::string stringValue;

MyStruct(int k, const std::string& s) : key(k), stringValue(s) {}

bool operator < (const MyStruct& str) const
{
return (key < str.key);
}
};
``````

Using this method means you can simply sort the vector as follows:

``````std::sort(vec.begin(), vec.end());
``````

Edit2: As Kappa suggests you can also sort the vector in the descending order by overloading a `>` operator and changing call of sort a bit:

``````struct MyStruct
{
int key;
std::string stringValue;

MyStruct(int k, const std::string& s) : key(k), stringValue(s) {}

bool operator > (const MyStruct& str) const
{
return (key > str.key);
}
};
``````

And you should call sort as:

``````std::sort(vec.begin(), vec.end(),greater<MyStruct>());
``````
335
3/26/2018 3:30:55 PM

In the interest of coverage. I put forward an implementation using lambda expressions.

C++11

``````#include <vector>
#include <algorithm>

using namespace std;

vector< MyStruct > values;

sort( values.begin( ), values.end( ), [ ]( const MyStruct& lhs, const MyStruct& rhs )
{
return lhs.key < rhs.key;
});
``````

C++14

``````#include <vector>
#include <algorithm>

using namespace std;

vector< MyStruct > values;

sort( values.begin( ), values.end( ), [ ]( const auto& lhs, const auto& rhs )
{
return lhs.key < rhs.key;
});
``````