Как эмулировать метод back () для массива?

В 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 ().

-1

Решение

Подумайте об использовании 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())

чтобы получить значение последнего элемента.

2

Другие решения

Вам нужна отдельно стоящая функция, которая поставляет требуемый синтаксический сахар:

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

Это будет работать для всех классов с rbegin() метод и const_reference вложенный тип. При необходимости добавьте вторую перегрузку для неконстантных ссылок.

Видеть это жить на Колиру

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector