boost :: numeric :: ublas :: vector中没有back()方法,
是否有可能在用户代码中使用预处理器宏以某种方式定义array_name[array_name.size()-1]
?
array_name[i].rbegin()->operator[] (i) = 1.0
或
array_name[i][array_name[i].size()-1][i] = 1.0
难以阅读,array_name[i].back()[i] = 1.0
易于阅读,这就是为什么我想要模仿back()方法。
答案 0 :(得分:2)
考虑使用std::array<>
而不是C阵列。然后你也会有array_name.back()
。注意,std::array<>
对C阵列没有任何开销。
如果真的必须是具有静态大小的C阵列,那么
array_name[(sizeof(array_name) / sizeof(array_name[0])) - 1]
虽然我还没有测试,但应该这样做。动态大小的数组(分配有new
或malloc()
的数组)不携带任何长度信息。如果没有在其他地方存储长度,你就无法确定它们的最后一个元素。
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