Using the 'sequenced<>' index you get semantics similar to 'std::list' see the codumentation and code example from boost. Change your 'typedef' to:
typedef boost::multi_index_container<
boost::shared_ptr<Temp>,
boost::multi_index::indexed_by<
boost::multi_index::sequenced<>,
boost::multi_index::ordered_non_unique<
boost::multi_index::const_mem_fun<Temp, unsigned int, &Temp::getParam>
>
>
> RequestsContainer;
And then, having the additional semantics of a 'std::list', you get a bidirectional iterator to the end and decrement it as per this question, like that:
RequestsContainer r;
/* ... fill r ... */
assert(!r.empty);
auto iter = r.end(); // from sequenced<>
--iter; // iter now points to the last element
r.erase(iter); // pop()
-- EDIT --
if what the semantics for "last" isn't the order of insertion but the order of your ordered_non_unique index, you can use 'reverse_iterator::base()' which gives a forward 'iterator' to the next element:
RequestsContainer r;
/* ... fill r ... */
auto index = r.get<1>(); // or get<0> if no sequenced<>
auto riter = index.rbegin(); // reverse_iterator
++riter; // points previous to last element
auto iter = riter.base(); // points to the last element
r.erase(iter); // pop()
See also this answer about converting reverse iterator to forward iterators.