2011-12-13 7 views

Respuesta

12

Puede usar memcmp en C++ también. También es nativo en C++.

Todo lo que necesita hacer es incluir <cstring> y luego utilizar el nombre totalmente calificado std::memcmp en lugar de memcmp. Es porque está en el espacio de nombres std, como cualquier otra función y clase de biblioteca estándar.

+0

¡Lo sé, pero estoy preguntando sobre algo que es C++ solamente !! – malhobayyeb

+1

@ MIH1406: Significa que no es 'memcmp' pero hace exactamente lo mismo? ¿Por qué crees que C++ proporcionaría otra función, que hace * exactamente * lo mismo que hace 'memcmp'? C++ evita la duplicación. ¿Y qué está mal con el uso de 'std :: memcmp'? – Nawaz

+0

No quiero usar las cosas de C. Necesito algo solo para C++. – malhobayyeb

1

Use memcmp. Es una función C++ perfectamente legítima.

1

memcmp es parte de la biblioteca estándar de C++ (por inclusión).

22

Si desea una función que pueda manejar tanto punteros como iteradores STL, eche un vistazo a std::equal en <algorithm>.

me gustaría considerar std::equal ser el C++ manera de hacer std::memcmp (que es de hecho todavía C++, pero std::memcmp no se ocupa de los objetos del iterador).


#include <iostream> 
#include <vector> 
#include <algorithm> 

int 
main (int argc, char *argv[]) 
{ 
    int a1[] = {1,2,3,4}; 
    int a2[] = {1,9,3,5}; 

    int * p1 = new int[4]; 

    std::vector<int> vec (a2, a2+4); 


    *(p1++) = 1; *(p1++) = 2; 
    *(p1++) = 3; *(p1++) = 4; 

    p1 -= 4; 


    if (std::equal (a1, a1+4, p1)) { 
    std::cout << "memory of p1 == memory of a1\n"; 
    } 

    if (std::equal (vec.begin(), vec.end(), p1) == false) { 
    std::cout << "memory of p1 != memory of vec\n"; 
    } 
} 

salida

memory of p1 == memory of a1 
memory of p1 != memory of vec 
+1

Creo que la diferencia clave es que memcmp compara bloques de bytes, mientras que igual compara rangos de objetos en función de la igualdad, sin embargo, se define para los objetos. - Un ejemplo, memcmp que evalúa los bytes de relleno que pueden rellenarse con basura arbitraria: http://ideone.com/aEdGa – UncleBens

+0

@UncleBens Sí, existen diferencias y la mayoría de las personas plantearán que std :: memcmp suele optimizarse para obtener mayor velocidad, aunque std :: equal podría tener (y con frecuencia tener) especializaciones de plantillas para tener el mismo rendimiento cuando se trata con tipos nativos. –

+0

@UncleBens Estoy seguro de que este no era su punto, sino de recordarles a los demás; no se recomienda en absoluto comparar la memoria bruta de los objetos (que a menudo incluyen el relleno). Como nos dirigimos C++, definir su propio '' en lugar del operador == –

1

memcmp es una parte de biblioteca de C++ estándar y disponible en <cstring>. Como su requisito es comparar 2 bloques de memoria (que tratan con la memoria bruta), debe usar memcmp u otras funciones en la biblioteca.

Si no desea ocuparse de la memoria, utilice contenedores C++ para gestionar la memoria de forma abstracta. ¡Entonces estarías lidiando con objetos!