2011-12-13 6 views

cevap

12

C++'da memcmp'u da kullanabilirsiniz. C++ da yerlidir.

Yapmanız gereken tek şey <cstring> içeriyor ve yerine std::memcmp tam nitelikli ad kullanıyor. Diğer tüm standart kitaplık işlevleri ve sınıfları gibi, std ad alanında olmasıdır.

+0

Bunu biliyorum ama C++ olan bir şey hakkında soru soruyorum! – malhobayyeb

+1

@ MIH1406: "memcmp" olmayan ancak tam olarak aynı şeyi yapan anlamına gelir? Neden C++ 'nun bir başka işlevi sağladığını düşünüyorsunuz, bu da * memcmp' ile aynı şeyi yapar? C++, çoğaltmayı önler. Ve 'std :: memcmp' kullanmanın nesi yanlış? – Nawaz

+0

C'nin eşyalarını kullanmak istemiyorum. Sadece C++ için bir şeye ihtiyacım var. – malhobayyeb

1

Memcmp kullanın. Tamamen meşru bir C++ işlevi.

1

memcmp, C++ standart kitaplığının bir parçasıdır (dahil etme).

22

Her iki göstergeyi ve STL yineleyicileri ele alabilen bir işlev istiyorsanız, <algorithm> numaralı telefondan std::equal'a bakın.

C++ std::memcmp yapmanın bir yolu olmalı std::equal dikkate alacağını (hala gerçekten C++, ancak yineleyici nesneleri std::memcmp işlemek değildir).


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

çıkış

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

Bence anahtar fark, memcmp'in bayt bloklarını karşılaştırmasıdır, oysa nesneler için eşitlik temeline dayalı nesnelerin eşit karşılaştırma aralıkları tanımlanmıştır. - Bir örnek, keyfi çöp ile doldurulabilen doldurma baytları bir örnek: http://ideone.com/aEdGa – UncleBens

+0

@UncleBens Evet, farklılıklar vardır ve çoğu kişi bu std :: memcmp en çok daha büyük için optimize edilir hız, std :: equal, yerel türlerle uğraşırken aynı performansa sahip olmak için şablon uzmanlıklarına sahip olabilir (ve çoğu zaman). –

+0

@UncleBens Eminim bu senin amacın değildi, ama başkalarına hatırlatmak için; Nesnelerin ham belleğini (sıklıkla dolgu içerir) karşılaştırmak hiç önerilmez. C++ yazdığımızdan, kendi operatörünüzü == 'tanımlayın, bunun yerine –

1

memcmp<cstring> bir C kısmı ++ standart kitaplığı ve kullanılabilir. Gereksiniminiz 2 bellek hafızasını (ham bellekle uğraşmak) karşılaştırmak olduğundan, kütüphanede memcmp veya diğer işlevleri kullanmanız gerekmektedir.

Bellek ile uğraşmak istemiyorsanız, bellek yönetimi için C++ kapsayıcılarını kullanın. O zaman nesnelerle uğraşıyor olacaksın!