2011-12-13 79 views

回答

12

您也可以在C++中使用memcmp。它也是C++原生的。

您需要做的只是包括<cstring>,然后使用完全限定名称std::memcmp而不是memcmp。这是因为它在std命名空间中,就像其他标准库函数和类一样。

+0

我知道,但是我问的只是C++的东西! – malhobayyeb

+1

@ MIH1406:不是'memcmp'但是完全一样的东西?为什么你认为C++会提供另一个函数,它和'memcmp'完全相同? C++避免了重复。而使用'std :: memcmp'有什么问题? – Nawaz

+0

我不想使用C的东西。我只需要用于C++的东西。 – malhobayyeb

1

使用memcmp。这是一个完全合法的C++函数。

1

memcmp是C++标准库的一部分(通过包含)。

22

如果你想要一个既能处理指针又能处理STL迭代器的函数,看看<algorithm>中的std::equal

我认为std::equal是C++的做法std::memcmp(它确实仍然是C++,但std::memcmp不处理迭代器对象)。


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

输出

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

我认为关键的区别在于memcmp比较字节块,而基于不同等级比较的对象范围是为对象定义的。 - 一个例子,memcmp评估填充字节,可以填充任意垃圾:http://ideone.com/aEdGa – UncleBens

+0

@UncleBens是的,有差异,大多数人会提出,std :: memcmp是最经常优化的更大速度,但std :: equal可能(并且经常有)模板特化,在处理本机类型时具有相同的性能。 –

+0

@UncleBens我相信这不是你的观点,而是提醒别人;不建议比较对象的原始内存(通常包括填充)。因为我们正在编写C++,所以定义你自己的'operator =='而不是 –

1
memcmp

是C的一部分++标准库和可用在<cstring>。由于您的要求是比较2块内存(处理原始内存),因此您必须在库中使用memcmp或其他函数。

如果你不想处理内存,那么使用C++容器来抽象内存管理。那么你会处理对象!