10 Nisan 2019 Çarşamba

std::string Char Accessor Metodları

Giriş
[] ve at() metodları ile yapılır. Her ikisinin de hem const dönen hem de dönmeyen türleri vardır.

1. [] metodu
İmzası şöyle.
const_reference operator[](size_type pos) const;
reference       operator[](size_type pos);
Açıklaması şöyle.
  1. Requires: pos <= size().
  2. Returns: *(begin() + pos) if pos < size(). Otherwise, returns a reference to an object of type charT with value charT(), where modifying the object leads to undefined behavior.
  3. Throws: Nothing.
  4. Complexity: constant time.
pos == size ise 
Açıklaması şöyle. En sondaki NULL karaktere erişime izin verir.
str[str.size()] basically points to the null-terminator character. You can read and write it, but you may only write a '\0' into it.
at() metodu gibi exception fırlatmaz çünkü metodu içi şöyle
template <class _CharT, class _Traits, class _Allocator>
inline
typename basic_string<_CharT, _Traits, _Allocator>::const_reference
basic_string<_CharT, _Traits, _Allocator>::operator[](size_type __pos) const _NOEXCEPT
{
  _LIBCPP_ASSERT(__pos <= size(), "string index out of bounds");
  return *(data() + __pos);
}

template <class _CharT, class _Traits, class _Allocator>
inline
typename basic_string<_CharT, _Traits, _Allocator>::reference
basic_string<_CharT, _Traits, _Allocator>::operator[](size_type __pos) _NOEXCEPT
{
  _LIBCPP_ASSERT(__pos <= size(), "string index out of bounds");
  return *(__get_pointer() + __pos);
}
pos == 0 ise
Örnek
Boş string için dikkatli kullanmak gerekir. Bu kodun C++14 ile çalışması garanti iken, daha eski bir standartta çalışmayabilir.
std::string my_string = "";
char test = my_string[0];
2. at metodu
İmzası şöyle.
const_reference at(size_type pos) const;
reference       at(size_type pos);
at () için pos == size() verirsek out_of_range exception alırız. Yani [] ve at() metodları arasında tutarsızlık var. Metodun içi şöyle
template <class _CharT, class _Traits, class _Allocator>
typename basic_string<_CharT, _Traits, _Allocator>::const_reference
basic_string<_CharT, _Traits, _Allocator>::at(size_type __n) const
{
  if (__n >= size())
    this->__throw_out_of_range();
  return (*this)[__n];
}

Hiç yorum yok:

Yorum Gönder