c++ - 以有效的方式逐字节比较数据(使用 C++)

标签 c++ comparison performance containers stl

有没有比使用比较更有效的字节比较数据的方法 C++ 列表容器的运算符?

我要比较【大? 10 kByte < size < 500 kByte] 按字节计算的数据量,以验证外部存储设备的完整性。

因此我按字节读取文件并将值存储在无符号字符列表中。 此列表的资源由 shared_ptr 处理, 这样我就可以在程序中传递它而无需担心列表的大小

typedef boost::shared_ptr< list< unsigned char > > = contentPtr;
namespace boost::filesystem = fs;

contentPtr GetContent( fs::path filePath ){
 contentPtr actualContent (new list< unsigned char > );       
 // Read the file with a stream, put read values into actual content
return actualContent;

这要完成两次,因为文件总是有两个拷贝。 必须比较这两个文件的内容,如果发现不匹配则抛出异常

void CompareContent() throw( NotMatchingException() ){
 // this part is very fast, below 50ms
 contentPtr contentA = GetContent("/fileA");
 contentPtr contentB = GetContent("/fileB");
 // the next part takes about 2secs with a file size of ~64kByte
 if( *contentA != *contentB )
      throw( NotMatchingException() );
}

我的问题是:
随着文件大小的增加,列表的比较变得非常慢。使用大约 100 kByte 的文件大小,比较内容最多需要两秒钟。随着文件大小的增加和减少....

有没有更有效的方法来进行这种比较?是用过的容器的问题吗?

最佳答案

不要使用 std::list 使用 std::vector

std::list 是一个链表,不保证元素是连续存储的。

std::vector 另一方面似乎更适合指定的任务(存储连续字节和比较大块数据)。

如果你需要多次比较多个文件并且不关心差异在哪里,你也可以计算每个文件的哈希值并比较哈希值。这样会更快。

关于c++ - 以有效的方式逐字节比较数据(使用 C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3609000/

相关文章:

c++ - 通过 new 赋值一个复杂的构造函数

c++ - 隐式转换运算符

c++ - 无法解析标识符 __PRETTY_FUNCTION__

c++ - 我可以禁用静态断言吗?

Python - 默认情况下,用户定义的类具有 __cmp__() 和 __hash__() 方法?或者?

swift - 如何在 Swift 中比较 CGError

r - 2个逻辑向量的元素之间的快速最小距离(间隔)(取2)

javascript - 比较两个对象数组 JS

c# - De Bruijn 算法二进制数字计数 64 位 C#

c - for 循环比较中什么更快?