I thought when sorting a vector of structs, the struct elements would be moved around, or the copy-constructor would be called, which will bring in some overhead, so it should be slow.
For example,
struct big_struct_t {
// with many data members, just to name a few
int val;
vector<string> strs;
...
};
int main() {
vector<big_struct_t> V;
... // populate V with 10k elements for example
sort(V.begin(), V.end(), [](const big_struct_t& lhs, const big_struct_t& rhs) {
return lhs.val < rhs.val;
});
}
But after testing the above code, seems like no copy-constructor called at all during sorting. So I wonder how the sort actually works? It doesn't need to move the elements around at all inside the vector?
CodePudding user response:
Like the comments said, the performance of std::sort is highly dependent on the elements.
std::vector stores elements contiguously. The only way to change the order of elements is to change their values, by copying, moving or swapping them.
std::sort works by comparing and swapping elements in a random-accessible range (such as a std::vector), which, consequently, must also satisfy 
As you can see, sorting a std::vector<bigger_struct_t> is 49x slower than std::vector<big_struct_t>, due to the std::array.
Sorting both std::list<bigger_struct_t> and std::list<big_struct_t> is much faster than std::vector<bigger_struct_t>, since they don't have to deal with the std::array.
Both are also considerably slower than std::vector<big_struct_t>, so avoid using std::list unless you need to.
PS: I'm not sure why std::list<bigger_struct_t> is slower than std::list<big_struct_t>. Maybe a problem with the benchmark? NOTE: See @FrançoisAndrieux's comment about the likely culprit being cache misses.
