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

时间:2015-10-21 08:40:36

标签: c++ c-preprocessor boost-ublas

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()方法。

2 个答案:

答案 0 :(得分:2)

考虑使用std::array<>而不是C阵列。然后你也会有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())

获取最后一个元素的值。

答案 1 :(得分:0)

你想要的是一个独立的功能,它提供你要求的语法糖:

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

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

请参阅此live on Coliru