web-dev-qa-db-fra.com

Vérifiez si deux vecteurs sont égaux

Comment puis-je vérifier si les premiers "n" éléments de deux vecteurs sont égaux ou non?

J'ai essayé ce qui suit:

#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;
}

Pourquoi affiche-t-il "échec" et non "succès"?

46
0x0

Utilisez le std::equal fonction de la <algorithm> entête:

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

Notez que les deux vecteurs doivent contenir au moins n éléments. Si l'un ou l'autre est trop court, le comportement de votre programme ne sera pas défini.

Si vous voulez vérifier si le vecteur entier est égal à l'autre, comparez-les comme vous compareriez autre chose:

if (v1 == v2)

Votre code (en échec) comparait un itérateur d'un vecteur avec un itérateur de l'autre. Les itérateurs de vecteurs égaux ne sont pas égaux. Chaque itérateur est lié à la séquence qu'il itère, donc un itérateur d'un vecteur ne sera jamais égal à l'itérateur d'un autre.

131
Rob Kennedy

La façon la plus simple (en termes de nombre de fonctions non quotidiennes à rechercher) de comparer les deux est de boucler à nouveau:

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

Cela fera à peu près la même chose, mais si vous préférez, vous pouvez utiliser le <algorithm> en-tête std::equal fonction: http://www.cplusplus.com/reference/algorithm/equal/

7
Tony Delroy