How do I check if two std::vector's contain only the same elements?

algorithm, c++, comparison, stl, vector

Solution

The standard way will be sorting these two vectors and using operator `==`, which compares corresponding values.

The sample solution realizing this algorithm is:

#include <vector>
#include <algorithm>

template<typename T>
bool compare(std::vector<T>& v1, std::vector<T>& v2)
{
    std::sort(v1.begin(), v1.end());
    std::sort(v2.begin(), v2.end());
    return v1 == v2;
}

Its complexity is O(n*log(n)), because of the sorting.

Problem

I need an algorithm or a standard library function for comparing two vector elements, like below: ``` class Utility { template <class T> static bool CheckIfVectorsEquivalent( const std::vector<T> & Vec1, const std::vector<T> & Vec2) { // ??? } }; ``` Working under the following specifications: ``` std::vector<int> v1, v2, v3, v4, v5, v6, v7, v8; // Returns false when not all the elements are matching between vectors v1.push_back(1); v1.push_back(3); v1.push_back(5); v2.push_back(2); v2.push_back(3); v2.push_back(8); Utility::CheckIfVectorsEquivalent(v1, v2); // Must return false // Returns true when all the elements match, even if the are not in the same order v3.push_back(3); v3.push_back(1); v3.push_back(7); v4.push_back(7); v4.push_back(3); v4.push_back(1); Utility::CheckIfVectorsEquivalent(v3, v4); // Must return true // Returns false when one of the vectors is subset of the other one v5.push_back(3); v5.push_back(1); v5.push_back(7); v6.push_back(7); v6.push_back(3); v6.push_back(1); v6.push_back(18); v6.push_back(51); Utility::CheckIfVectorsEquivalent(v5, v6); // Must return false // Returns true when the both vectors are empty Utility::CheckIfVectorsEquivalent(v7, v8); // Must return true ``` Is there any standard (with STL) way of doing this? If not, how can I write this algorithm? It confused me too much.

Original source