![](/img/trans.png)
[英]How to emulate C array initialization "int arr[] = { e1, e2, e3, ... }" behaviour with std::array?
[英]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.0
或array_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]
应该可以解决问题,尽管我尚未进行测试。 动态大小的数组(使用new
或malloc()
分配的数组)不包含任何长度信息。 如果没有将长度存储在其他位置,则无法确定它们的最后一个元素。
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
嵌套类型的所有类。 如果需要,为非常量引用添加第二个重载。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.