【问题标题】:Comparing an std::array to a traditional array C++将 std::array 与传统数组 C++ 进行比较
【发布时间】:2019-01-17 12:10:26
【问题描述】:

我正在尝试对以下元素进行比较:

std::vector<std::array<uint8_t, 6> > _targets =
{
  { 0x00, 0x00, 0x00, 0x00, 0x00, 0x11 }
  { 0x00, 0x00, 0x00, 0x00, 0x00, 0x22 }
};

到传统数组:

 uint8_t _traditional[6] =  { 0x00, 0x00, 0x00, 0x00, 0x00, 0x33 }

作为:

  for (auto target : _targets) 
  {

     if (! memcmp(target, _traditional, 6)) {
        known = 1;
     } 
  }

我收到一个数据转换错误:

error: cannot convert 'std::array<unsigned char, 6u>' to 'const void*' for argument '1' to 'int memcmp(const 
void*, const void*, size_t)

我可以执行什么属性字节比较操作来完成相等性评估?

【问题讨论】:

  • 为什么不将_traditional 也设为std::array 并使用==?
  • @Cheers 有没有办法临时施放它?它是我利用的大型第 3 方库的一部分
  • std::equal 怎么样?
  • 小心那些领先的下划线。有时它们意味着一些特别的东西。 [在 C++ 标识符中使用下划线的规则是什么?](stackoverflow.com/questions/228783/…

标签: c++ arrays c++11


【解决方案1】:

您可以使用array 的data() 成员来获取指向所包含数组的指针:

if (! memcmp(target.data(), _traditional, 6))

在这种情况下使用&amp;target[0] 的替代方法将起作用(您存储uint8_t),但如果您存储的类重载一元&amp;(地址)运算符,则将不起作用。但是您可以使用std::addressof(target[0]),即使存在重载的地址运算符,它也可以工作。

【讨论】:

  • 除非std::array 的实现者疯了或解决了一个非常有趣的问题,否则它应该可以工作的一种情况`
  • 只是出于好奇,但你能用&amp;target[0] 替换target.data() 吗?
  • 除了target.data() 之外,只有&amp;target[0] 可以保证工作。 afaik(也可能是&amp;target,但不确定)。
  • @galik 如果存储的类型已覆盖&amp;,则&amp;target[0] 可能与target.data() 不同,否则不会不同。
  • @Yakk-AdamNevraumont 那么问题是关于uint8_t,否则memcmp 会切块。
猜你喜欢
  • 1970-01-01
  • 2014-08-12
  • 2016-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-29
相关资源
最近更新 更多