В 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()
также. Обратите внимание, что 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
вложенный тип. При необходимости добавьте вторую перегрузку для неконстантных ссылок.
Видеть это жить на Колиру