c++ - 如何在 std::map 中使用表示不透明字节的类?

标签 c++ stl

我有一些不透明的字节,我想在 std::map 中用作键和值。我创建了一个类 OpaqueBytes,它有两个(私有(private))成员:_data_size,用于存储字节。我的 Cocoa 背景告诉我,我需要在类上实现散列函数和相等函数才能在 std::map 中使用它。问题是,STL 似乎需要严格的弱排序,基于 Can a STL map be used with keys of varying sizes .

我有几个问题:

  1. 我创建一个类来表示不透明字节的直觉是否正确? STL 中是否已经存在一个类来保存不透明字节?用 Cocoa 的说法,是否有一个等同于 NSData 的东西?

  2. 我应该如何实现 OpaqueBytes 的排序?我不能只使用 memcmp 比较字节,因为两个字节字符串的长度可能不同 - 我不希望 FF EE 被视为等于 FF。

最佳答案

如果您需要使用 OpaqueBytes 作为键,您将需要进行严格的比较。这可以是成员函数或非成员函数。

可以使用这样的东西:

// assumed a friend
bool operator<( OpaqueBytes const& lhs, OpaqueBytes const& rhs )
{
   int res = memcmp( lhs._data, rhs._data, std::min(lhs_._size, rhs_._size)  );
   return ( res < 0 ) || ( res == 0 && lhs._size < rhs._size );
}

当然,您可以先比较尺寸。您会得到不同的顺序,但仍然很严格。

(我仍然认为,顺便说一下,使用比较函数比使用较少函数更好地实现 map )。

关于c++ - 如何在 std::map 中使用表示不透明字节的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5193575/

相关文章:

c++ - 我可以/我应该使用 std::exception 进行常规错误处理吗?

c++ - 正确使用 OOP

c++ - 我如何检查迭代器是否到达列表末尾?

c++ - 从 STL 集中删除最大元素

c++ - STL List 和 Vector 是如何实现的?

c++ - 从 vector 中取一些值

c++ - 如何通过 boost spirit 提取 std::string 对象

c++ - 删除 C++-STL/Boost 调试符号(...或不创建它们)

c++ - 从基类调用派生类函数而不使用虚函数

c++ - STLportd.5.2.dll 和 STLportSTLd.5.2.dll 有什么区别?