2011-03-07 31 views
16

Me preguntaba si hay alguna función para comparar dos vectores de cadena para devolver el número de elementos diferentes (o el mismo)? O tengo que iterar sobre ambos y probar elemento por elemento.
Gracias.Comparar dos vectores C++

+0

¿Necesita comparar solo los elementos con el mismo índice o tiene el algoritmo para detectar coincidencias en diferentes posiciones? –

+0

necesita detectar coincidencias sí – Kobe

+0

¿Cómo detectaría las coincidencias en diferentes posiciones para todos los elementos? En ese caso, la cantidad de vectores es irrelevante. ¿Estás seguro de que eso es lo que quieres? –

Respuesta

40
std::sort(v1.begin(), v1.end()); 
std::sort(v2.begin(), v2.end()); 
std::vector<string> v3; 
std::set_intersection(v1.begin(), v1.end(), v2.begin(), v2.end(), std::back_inserter(v3)); 

O, si usted no desea ordenar:

std::set<string> s1(v1.begin(), v1.end()); 
std::set<string> s2(v2.begin(), v2.end()); 
std::vector<string> v3; 
std::set_intersection(s1.begin(), s1.end(), s2.begin(), s2.end(), std::back_inserter(v3)); 

Es posible que desee utilizar un conjunto múltiple si podría haber duplicados en un vector.

+0

buen pensamiento :) – Kobe

+0

OK, solo necesito agregar #include #include

4

No conozco una función existente, pero escribir una usted mismo no debería ser un problema.

int compare(const vector<string>& left, const vector<string>& right) { 
    auto leftIt = left.begin(); 
    auto rightIt = right.begin(); 
    auto diff = 0; 
    while (leftIt != left.end() && rightIt != right.end()) { 
    if (*leftIt != *rightIt) { 
     diff++; 
    } 
    leftIt++; 
    rightIt++; 
    } 

    // Account for different length vector instances 
    if (0 == diff && (leftIt != left.end() || rightIt != right.end())) { 
    diff = 1; 
    } 

    return diff; 
} 

Notas

  • omitida std:: prefijo para mayor brevedad
  • Esta función necesita ser actualizado si se debe manejar vector<string> casos de diferentes longitudes
+0

Gracias, pensé que necesito implementar uno ... por cierto sobre su código, ¿hay alguna razón específica por la que usa el auto para sus variables locales? :) nunca vio auto usado hasta ahora – Kobe

+0

@vBx, en C++ 0x 'auto' se volvió a proponer para la inferencia de tipo. En los usos 'auto' anteriores, el compilador puede inferir el tipo para mí, así que no tengo que escribir el' vector :: const_iterator' completo para ambos iteradores. Es muy similar a la palabra clave 'var' de C# – JaredPar

+0

Podemos hacerlo mejor con count_if() podemos. –