c++ 将std::find_if与灵活数组一起使用

but5z9lq  于 2023-02-26  发布在  其他
关注(0)|答案(1)|浏览(155)

假设我有以下两个结构,其中struct sB有一个灵活的数组:

struct sA
{
  double valueA;
  double valueB;
};

struct sB
{
  double c;
  size_t arrayMembers;
  sA aM[];
};

我想遍历aM,找到第一个包含valueA > c and valueB > c的元素,我想用std::find_if()来做。
我尝试使用std::begin()std::end()

auto primeElement = std::find_if(std::begin(sBInstance.aM), std::end(sBInstance.aM),
      [&](const sB v){return (v.valueA > c && v.valueB > c)});

但是,它不会编译并出现编译器错误(以及其他相关错误):
'标准::开始':找不到匹配的重载函数
我认为灵活数组更像C而不是C++,C++迭代器可能不是特别适合它们,但是有没有一种方法可以在灵活数组上使用std::find_if()?如果有多种方法,哪一种是最直接的?

ntjbwcob

ntjbwcob1#

标准C不支持灵活数组成员。这是C的一个特性,但不是C的一部分。如果需要一个包含可变长度数组成员的对象,请改用std::vector
如果你的编译器支持灵活的数组成员作为扩展,你需要把它们更像是指向动态分配数组的指针,而不是静态大小的C数组。因为它们的大小在编译时是未知的,std::end()不能静态地计算一个合适的偏移量。相反,你需要把arrayMembers作为一个偏移量添加到aM成员,指向数组的第一个元素:

auto primeElement = std::find_if(
    sBInstance->aM,
    sBInstance->aM + sBInstance->arrayMembers,
    [&](const sA& v){ return v.valueA > c && v.valueB > c; }
);

这是有效的,因为指针是一种迭代器,所以指向数组开头和数组末尾后一个的指针是有效的迭代器范围,可以迭代该数组。

相关问题