2013-03-06 9 views
5

Kilka przykładów dostępnych w Internecie używa operatora równości do porównania zawartości dwóch obiektów STL vector w celu sprawdzenia, czy mają tę samą treść.Jaka jest różnica między tymi dwoma sposobami porównywania wektorów STL?

vector<T> v1; 
// add some elements to v1 

vector<T> v2; 
// add some elements to v2 

if (v1 == v2) cout << "v1 and v2 have the same content" << endl; 
else cout << "v1 and v2 are different" << endl; 

Zamiast tego czytam inne przykłady, w których użyto funkcji std::equal().

bool compare_vector(const vector<T>& v1, const vector<T>& v2) 
{ 
    return v1.size() == v2.size() 
      && std::equal(v1.begin(), v1.end(), v2.begin()); 
} 

Jaka jest różnica między tymi dwoma sposobami porównywania wektorów STL?

+1

Nie ma różnicy. –

Odpowiedz

8

Dwa zachowują się dokładnie w ten sam sposób. Wymagania pojemnik (tabela 96), że a == b ma semantykę operacyjne:

distance(a.begin(), a.end()) == distance(b.begin(), b.end()) && 
equal(a.begin(), a.end(), b.begin()) 
+0

Kerrek SB, co to jest Tabela 96? – astidham2003

+1

W jaki sposób zdefiniowano operatora równego? IOW, dlaczego nie użyć size() zamiast odległości? –

+1

@RyanGuthrie: "operacyjna semantyka". Wszystko jest prawdopodobnie wstawione, a 'size()' jest zwykle obliczane jako różnica. Nie przejmuj się. –

5

dobre pytanie. Podejrzewam, że ludzie nie używają ==, ponieważ nie wiedzą o tym, ale robi to dokładnie to, co robi ręcznie zakodowana wersja. Zawsze był tam dla pojemników sekwencyjnych i dla pojemników asocjacyjnych.

+0

Czy to samo dotyczy wektorów w C++ 03 –

+2

@Ben - tak, zawsze tak było. I źle pamiętałem w mojej oryginalnej odpowiedzi; Kontakty asocjacyjne zawsze zawierały '==' (i '! ='). –