Hay alguna forma de comparar dos vectores?

if (vector1 == vector2)
    DoSomething();

Nota: en la Actualidad, estos vectores no son ordenados y contener valores enteros.

  • No se compilar?
  • Significa que desee comparar con independencia de que el orden de los elementos en el vector? De lo contrario, el código anterior debe trabajar.
  • Una manera sencilla de comparar si usted tiene dos sin ordenar matrices que desea comprobar contienen exactamente los mismos valores, es ordenar y, a continuación, utilice cualquiera de los de la biblioteca estándar de métodos para hacer una comparación.
  • Si sólo fuera así de simple. VS2013 utiliza std::equals para implementar ==, a continuación, afirma que en tiempo de ejecución debido a que los iteradores no vienen de la misma contenedor(!) Usted tiene que fijar _ITERATOR_DEBUG_LEVEL=1 (o =0) en todos los proyectos que utilizan o podrían utilizar, ==. Arg!!
InformationsquelleAutor Jame | 2011-06-06

5 Comentarios

  1. 25

    De verificación std::desajuste método de C++.

    la comparación de los vectores ha sido discutido en DaniWeb foro y también respondió.

    C++: Comparación de dos vectores

    De verificación de la siguiente MANERA posterior. será útil para usted. que han conseguido el mismo con diferente-2 método.

    Comparar dos vectores de C++

    • ¿Que requieren el rango de ser ordenados?
    • Compruebe el segundo enlace ..
    • lexicographical_compare funciona aquí también, y elimina el tener que lidiar con que gama es el de más largo alcance.
    • Por favor publicar los detalles del enlace ar reffering aquí, si que va el enlace abajo, en el futuro, toda respuesta se convierte en inútil.
    • Una mala respuesta. Usted debe proporcionar el código de ejemplo no solo enlaces – ¿y si llegan?
  2. 63

    Su código (vector1 == vector2) es la correcta sintaxis de C++. Hay un == operador para los vectores.

    Si quieres comparar a corto vector con una parte de un tiempo de vector, puede utilizar elequal() operador para los vectores. (la documentación aquí)

    He aquí un ejemplo:

    using namespace std;
    
    if( equal(vector1.begin(), vector1.end(), vector2.begin()) )
        DoSomething();
    • std::igual() es válida también para la llanura de matrices, mientras que el operador de igualdad no es, por ejemplo: int a[1000], b[1000]; if(std::igual a(a, a+1000,b)) DoSomething();
    • Buena respuesta, a excepción de que esto anima a la mala práctica (using namespace std) en lugar de utilizar la más clara std::equal.
  3. 2

    De acuerdo a la discusión aquí usted puede comparar directamente los dos vectores utilizando

    ==

    if (vector1 == vector2){
       //true
    }
    else{
       //false
    }
  4. 1

    Si realmente absolutamente tienen que permanecer sin clasificar (que en realidad no.. y si usted está tratando con cientos de miles de elementos, entonces tengo que preguntar por qué usted sería la comparación de los vectores como este), puedes hackear un método de comparación que trabaja con sin ordenar matrices.

    La única manera de que a pesar de hacerlo era crear un temporal vector3 y pretenden hacer un set_intersection mediante la adición de todos los elementos de vector1, después de hacer una búsqueda para cada elemento individual de vector2 en vector3 y eliminarlo si lo encuentra. Sé que suena terrible, pero por eso no voy a escribir ningún estándar de C++ bibliotecas en cualquier momento pronto.

    Realmente, sin embargo, sólo un tipo de ellos en primer lugar.

    • o se pueden crear dos set objetos y compararlos? ¿No sería más fácil si es que realmente se requiere para no tocar a los vectores.
    • Depende de qué tan rápido N de búsqueda y quitar operaciones están en un vector (N*O(N)) versus 2 conjunto de constructores ordenar N elementos (cplusplus.com’s de referencia, dice: «Por sin ordenar secuencias, linearithmic (N*logN)..») + de un criterio de comparación (O(N)).
  5. 0

    C++11 estándar en == para std::vector

    Otros han mencionado que operator== hace comparar el vector de contenidos y las obras, pero aquí es una cita de la C++11 N3337 borrador de estándar que creo que implica que.

    Primero nos fijamos en el Capítulo 23.2.1 «General requisitos de contenedor», que documenta las cosas que deben ser válidos para todos contenedores, incluyendo por lo tanto std::vector.

    Que la sección de la Tabla 96 «requisitos de Contenedor», que contiene una entrada:

    Expression   Operational semantics
    ===========  ======================
    a == b       distance(a.begin(), a.end()) == distance(b.begin(), b.end()) &&
                 equal(a.begin(), a.end(), b.begin())

    La distance parte de la semántica significa que el tamaño de los dos recipientes son el mismo, pero declaró en una generalizada de iterador de manera amigable para el no acceso aleatorio direccionable de contenedores. distance() se define en 24.4.4 «Iterador de operaciones».

    A continuación, la pregunta clave es ¿qué equal() decir. Al final de la tabla podemos ver:

    Notas: el algoritmo de la igualdad() está definido en la Cláusula 25.

    y en la sección 25.2.11 «Igual», nos encontramos con su definición:

    template<class InputIterator1, class InputIterator2>
    bool equal(InputIterator1 first1, InputIterator1 last1,
               InputIterator2 first2);
    
    template<class InputIterator1, class InputIterator2,
    class BinaryPredicate>
    bool equal(InputIterator1 first1, InputIterator1 last1,
               InputIterator2 first2, BinaryPredicate pred);

    1 Devuelve: true si para cada iterador i en el intervalo [first1,last1) las siguientes condiciones: *i == *(first2 + (i - first1)), pred(*i, *(first2 + (i - first1))) != false. De lo contrario, devuelve false.

    En nuestro caso, nos preocupamos de la versión sobrecargada sin BinaryPredicate versión, que corresponde a la primera pseudo código definición *i == *(first2 + (i - first1)), lo que vemos es sólo un iterador-friendly definición de «todos a afirmar los elementos son los mismos».

    Preguntas similares para otros tipos de recipientes:

Dejar respuesta

Please enter your comment!
Please enter your name here