繁体   English   中英

如何模拟数组的back()方法?

[英]How to emulate back() method for array?

boost :: numeric :: ublas :: vector中没有back()方法,是否可以在用户代码中使用预处理器宏以某种方式定义array_name[array_name.size()-1]来模拟它?

array_name[i].rbegin()->operator[] (i) = 1.0array_name[i][array_name[i].size()-1][i] = 1.0难以阅读, array_name[i].back()[i] = 1.0易于阅读,这就是为什么我想模仿back()方法。

考虑使用std::array<>而不是C数组。 然后,您array_name.back()拥有array_name.back() 注意, std::array<>不会给C数组带来任何开销。

如果确实必须是具有静态大小的C数组,则

array_name[(sizeof(array_name) / sizeof(array_name[0])) - 1]

应该可以解决问题,尽管我尚未进行测试。 动态大小的数组(使用newmalloc()分配的数组)不包含任何长度信息。 如果没有将长度存储在其他位置,则无法确定它们的最后一个元素。

BTW .: boost::numeric::ublas::vector确实有size() ,所以你可以做

vector_name[vector_name.size() - 1]

它还具有反向迭代器。 你可以做

*(vector_name.rbegin())

获取最后一个元素的值。

您想要的是一个独立功能,可提供您所需要的语法糖:

template <typename C>
typename C::const_reference back(const C & container)
{
    return *container.rbegin();
}

这将适用于具有rbegin()方法和const_reference嵌套类型的所有类。 如果需要,为非常量引用添加第二个重载。

在Coliru上实时观看

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM