-1

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

4

2 回答 2

2

考虑使用std::array<>而不是 C 数组。然后你也会有array_name.back()。请注意,这std::array<>对 C 数组没有任何开销。

如果它真的必须是具有静态大小的 C 数组,那么

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

应该做的伎俩,虽然我还没有测试过。new动态大小的数组(用or分配的数组malloc())不携带任何长度信息。如果没有将长度存储在其他地方,则无法确定它们的最后一个元素。

顺便说一句:boost::numeric::ublas::vector确实有size(),所以你可以做

vector_name[vector_name.size() - 1]

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

*(vector_name.rbegin())

获取最后一个元素的值。

于 2015-10-21T09:07:04.187 回答
0

你想要的是一个独立的函数,它提供你所要求的语法糖:

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

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

在Coliru上现场观看

于 2015-10-21T11:32:49.700 回答