Which C 20 standard library containers have a .at
function? For example, at least std::map
, std::unordered_map
and std::vector
do. What others are there?
Is there some way to work this out without going through the 2000 page standard by hand?
CodePudding user response:
From comments, it seems you want something like:
template <typename Container, typename T>
typename Container::pointer my_at(Container&, const T&)
requires (requires(Container c, const T& key) { c.at(key); })
{
// ...
}
CodePudding user response:
I don't think a pointer is the appropriate type to return for this operation, instead it should be an iterator. At which point the definition splits into two cases:
Random access containers:
iterator at_(size_type index) noexcept { return index < size() ? begin() index : end(); }
const_iterator at_(size_type index) const noexcept { return index < size() ? begin() index : end(); }
map
and unordered_map
:
template<typename T>
iterator at_(T && key) noexcept { return find(std::forward<T>(key)); }
template<typename T>
const_iterator at_(T && key) const noexcept { return find(std::forward<T>(key)); }
And then rather than testing against nullptr
, you test against the container's end()
.
It's also a reasonable question as to whether (unordered_)map needs an alias for an existing member to match your nomenclature
CodePudding user response:
I ended up grepping libstdc include directory for \bat(
and that has given me:
std::basic_string
std::basic_string_view
std::array
std::vector
std::vector<bool>
std::unordered_map
std::map
std::dequeue
I'm not sure if this is exhaustive.
There is also rope
and vstring
but I don't think these are standard.