Check if two vectors are equal

C++VectorSet

C++ Problem Overview


How can I check whether the first "n" elements of two vectors are equal or not?

I tried the following:

#include <iostream>
#include <vector>
#include <iterator>
using namespace std;

typedef vector<double> v_t;

int main(){
    v_t v1,v2;
    int n = 9;

    for (int i = 1; i<10; i++){
        v1.push_back(i);
        v2.push_back(i);
    }
    v1.push_back(11);
    v2.push_back(12);

    if (v1.begin()+n == v2.begin()+n)
        cout << "success" << endl;
    else
        cout << "failure" << endl;
}

Why does it print "failure" and not "success"?

C++ Solutions


Solution 1 - C++

Use the std::equal function from the <algorithm> header:

if (std::equal(v1.begin(), v1.begin() + n, v2.begin())
  std::cout << "success" << std::endl;

Note that both vectors must have at least n elements in them. If either one is too short, behavior of your program will be undefined.

If you want to check whether the entire vector is equal to the other, just compare them like you'd compare anything else:

if (v1 == v2)

Your (failed) code was comparing an iterator of one vector with an iterator of the other. Iterators of equal vectors are not equal. Each iterator is tied to the sequence it's iterating, so an iterator from one vector will never be equal to the iterator of another.

Solution 2 - C++

The easiest (in terms of fewest non-everyday functions to look up) way to compare the two is to loop again:

bool are_equal = true;
for (int i = 0; i < first_how_many; i++)
    if (v1[i] != v2[i])
    {
        are_equal = false;
        break;
    }

It'll do much the same thing, but if you prefer you can use the <algorithm> header's std::equal function: http://www.cplusplus.com/reference/algorithm/equal/

Solution 3 - C++

First, there is no need to keep track the size of a vector, i.e. n is useless; begin(v) + n == end(v) or just n == size(v) (the size information is in the vector class).

Now, I just want to point out a C++20 feature, the ranges library. It simplifies a lot of standard algorithms' function signatures, for instance the current "best" way to solve your problem would be:

std::ranges::equals(v1, v2); // returns a bool

Instead of the previous std::equals(begin(v1), end(v1), begin(v2)). Also, if your ranges are more complex (i.e. vector of a class), you should consider the projection feature (if you want to apply a function before the comparaison, or compare a given member variable etc.).

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Question0x0View Question on Stackoverflow
Solution 1 - C++Rob KennedyView Answer on Stackoverflow
Solution 2 - C++Tony DelroyView Answer on Stackoverflow
Solution 3 - C++Arthur R.View Answer on Stackoverflow