假设我有以下两个结构,其中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()
?如果有多种方法,哪一种是最直接的?
1条答案
按热度按时间ntjbwcob1#
标准C不支持灵活数组成员。这是C的一个特性,但不是C的一部分。如果需要一个包含可变长度数组成员的对象,请改用
std::vector
。如果你的编译器支持灵活的数组成员作为扩展,你需要把它们更像是指向动态分配数组的指针,而不是静态大小的C数组。因为它们的大小在编译时是未知的,
std::end()
不能静态地计算一个合适的偏移量。相反,你需要把arrayMembers
作为一个偏移量添加到aM
成员,指向数组的第一个元素:这是有效的,因为指针是一种迭代器,所以指向数组开头和数组末尾后一个的指针是有效的迭代器范围,可以迭代该数组。