Home > Software engineering >  Which C 20 standard library containers have a .at member access function?
Which C 20 standard library containers have a .at member access function?

Time:03-19

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); })
{
   // ...
}

Demo

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.

  • Related