NexusForce 1.0.0
A Modern C++ Library with extended functionality, web components, and utility libraries
载入中...
搜索中...
未找到
basic_string_view.hpp
浏览该文件的文档.
1#ifndef NEFORCE_CORE_STRING_BASIC_STRING_VIEW_HPP__
2#define NEFORCE_CORE_STRING_BASIC_STRING_VIEW_HPP__
3
12
16NEFORCE_BEGIN_NAMESPACE__
17
23
25template <typename CharT, typename Traits = char_traits<CharT>>
28
29
38template <typename Traits>
39struct basic_string_view_iterator : iiterator<basic_string_view_iterator<Traits>> {
40public:
48
49private:
50 pointer data_ = nullptr;
51 size_t size_ = 0;
52 size_t idx_ = 0;
53
54public:
55 constexpr basic_string_view_iterator() noexcept = default;
56 NEFORCE_CONSTEXPR20 ~basic_string_view_iterator() = default;
57
58 constexpr basic_string_view_iterator(const basic_string_view_iterator&) noexcept = default;
59 constexpr basic_string_view_iterator& operator=(const basic_string_view_iterator&) noexcept = default;
60 constexpr basic_string_view_iterator(basic_string_view_iterator&&) noexcept = default;
61 constexpr basic_string_view_iterator& operator=(basic_string_view_iterator&&) noexcept = default;
62
69 constexpr basic_string_view_iterator(const pointer data, const size_t size, const size_t off) noexcept :
70 data_(data),
71 size_(size),
72 idx_(off) {}
73
78 NEFORCE_NODISCARD constexpr reference dereference() const noexcept {
79 NEFORCE_DEBUG_VERIFY(data_, "Attempting to dereference on a null pointer");
80 NEFORCE_DEBUG_VERIFY(idx_ < size_, "Attempting to dereference out of boundary");
81 return data_[idx_];
82 }
83
87 constexpr void increment() noexcept {
88 NEFORCE_DEBUG_VERIFY(data_, "Attempting to increment a null pointer");
89 NEFORCE_DEBUG_VERIFY(idx_ < size_, "Attempting to increment out of boundary");
90 ++idx_;
91 }
92
96 constexpr void decrement() noexcept {
97 NEFORCE_DEBUG_VERIFY(data_, "Attempting to decrement a null pointer");
98 NEFORCE_DEBUG_VERIFY(idx_ != 0, "Attempting to decrement out of boundary");
99 --idx_;
100 }
101
106 constexpr void advance(difference_type off) noexcept {
107 NEFORCE_DEBUG_VERIFY(data_ || off == 0, "Attempting to advance a null pointer");
108 NEFORCE_DEBUG_VERIFY((off < 0 ? idx_ >= -off : size_ - idx_ >= off), "Attempting to advance out of boundary");
109 idx_ += off;
110 }
111
117 NEFORCE_NODISCARD constexpr difference_type distance_to(const basic_string_view_iterator& other) const noexcept {
118 NEFORCE_DEBUG_VERIFY(data_ == other.data_ && size_ == other.size_,
119 "Attempting to distance to a different container");
120 return static_cast<difference_type>(idx_ - other.idx_);
121 }
122
128 NEFORCE_NODISCARD constexpr reference operator[](const difference_type n) const noexcept { return *(*this + n); }
129
135 NEFORCE_NODISCARD constexpr bool equal_to(const basic_string_view_iterator& rhs) const noexcept {
136 NEFORCE_DEBUG_VERIFY(data_ == rhs.data_ && size_ == rhs.size_, "Attempting to equal to a different container");
137 return idx_ == rhs.idx_;
138 }
139
145 NEFORCE_NODISCARD constexpr bool less_than(const basic_string_view_iterator& rhs) const noexcept {
146 NEFORCE_DEBUG_VERIFY(data_ == rhs.data_ && size_ == rhs.size_, "Attempting to less than a different container");
147 return idx_ < rhs.idx_;
148 }
149
154 NEFORCE_NODISCARD constexpr pointer base() const noexcept { return data_ + idx_; }
155};
156
157
168template <typename CharT, typename Traits>
169class basic_string_view : public icommon<basic_string_view<CharT, Traits>> {
171 "char type of basic string view should be same with char traits.");
173 "basic string view only contains non-array trivial standard-layout types.");
174
175public:
176 using value_type = CharT;
177 using pointer = const CharT*;
178 using reference = const CharT&;
179 using const_pointer = const CharT*;
180 using const_reference = const CharT&;
187 using traits_type = Traits;
188
190 static constexpr auto npos = static_cast<size_type>(-1);
191
192private:
193 const_pointer data_ = nullptr;
194 size_type size_ = 0;
195
202 NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr size_type clamp_size(const size_type position,
203 const size_type size) const noexcept {
204 return _NEFORCE min(size, size_ - position);
205 }
206
207public:
208 constexpr basic_string_view() noexcept = default;
209 constexpr basic_string_view(const basic_string_view&) noexcept = default;
210 constexpr basic_string_view& operator=(const basic_string_view&) noexcept = default;
211
218 constexpr basic_string_view(const_pointer str) noexcept :
219 data_(str),
220 size_(Traits::length(str)) {}
221
229 constexpr basic_string_view(const_pointer str, const size_type n) noexcept :
230 data_(str),
231 size_(n) {}
232
241 template <typename Iterator, enable_if_t<is_same_v<iter_value_t<Iterator>, value_type>, int> = 0>
242 constexpr basic_string_view(Iterator start, Iterator finish) :
243 data_(&*start),
244 size_(_NEFORCE distance(start, finish)) {}
245
249 NEFORCE_CONSTEXPR20 ~basic_string_view() noexcept = default;
250
255 NEFORCE_NODISCARD constexpr const_iterator begin() const noexcept { return const_iterator(data_, size_, 0); }
256
261 NEFORCE_NODISCARD constexpr const_iterator end() const noexcept { return const_iterator(data_, size_, size_); }
262
267 NEFORCE_NODISCARD constexpr const_iterator cbegin() const noexcept { return begin(); }
268
273 NEFORCE_NODISCARD constexpr const_iterator cend() const noexcept { return end(); }
274
279 NEFORCE_NODISCARD constexpr const_reverse_iterator rbegin() const noexcept { return const_reverse_iterator(end()); }
280
285 NEFORCE_NODISCARD constexpr const_reverse_iterator rend() const noexcept { return const_reverse_iterator(begin()); }
286
291 NEFORCE_NODISCARD constexpr const_reverse_iterator crbegin() const noexcept { return rbegin(); }
292
297 NEFORCE_NODISCARD constexpr const_reverse_iterator crend() const noexcept { return rend(); }
298
303 NEFORCE_NODISCARD constexpr size_type size() const noexcept { return size_; }
304
309 NEFORCE_NODISCARD constexpr size_type max_size() const noexcept {
310 return (npos - sizeof(size_type) - sizeof(void*)) / sizeof(value_type) / 4;
311 }
312
317 NEFORCE_NODISCARD constexpr size_type length() const noexcept { return size_; }
318
323 NEFORCE_NODISCARD constexpr bool empty() const noexcept { return size_ == 0; }
324
331 NEFORCE_NODISCARD constexpr const_pointer data() const noexcept { return data_; }
332
337 NEFORCE_NODISCARD constexpr const_reference front() const noexcept {
338 NEFORCE_DEBUG_VERIFY(!empty(), "cannot call front on empty string_view");
339 return data_[0];
340 }
341
346 NEFORCE_NODISCARD constexpr const_reference back() const noexcept {
347 NEFORCE_DEBUG_VERIFY(!empty(), "cannot call back on empty string_view");
348 return data_[size_ - 1];
349 }
350
356 NEFORCE_NODISCARD constexpr const_reference operator[](const size_type n) const noexcept {
357 NEFORCE_DEBUG_VERIFY(n <= size_, "basic string view index out of ranges.");
358 return data_[n];
359 }
360
366 NEFORCE_NODISCARD constexpr const_reference at(const size_type n) const {
367 NEFORCE_DEBUG_VERIFY(n <= size_, "basic string view index out of ranges.");
368 return data_[n];
369 }
370
377 constexpr void remove_prefix(const size_type n) noexcept {
378 NEFORCE_DEBUG_VERIFY(size_ >= n, "cannot remove prefix longer than total size");
379 data_ += n;
380 size_ -= n;
381 }
382
389 constexpr void remove_suffix(const size_type n) noexcept {
390 NEFORCE_DEBUG_VERIFY(size_ >= n, "cannot remove suffix longer than total size");
391 size_ -= n;
392 }
393
401 constexpr size_type copy(CharT* const str, size_type count, const size_type off = 0) const {
402 NEFORCE_DEBUG_VERIFY(off <= size_, "basic string view index out of ranges.");
403 count = clamp_size(off, count);
404 Traits::copy(str, data_ + off, count);
405 return count;
406 }
407
414 NEFORCE_NODISCARD constexpr basic_string_view substr(const size_type off = 0, const size_type count = npos) const {
415 NEFORCE_DEBUG_VERIFY(off <= size_, "basic string view index out of ranges.");
416 const size_type clamp = clamp_size(off, count);
417 return basic_string_view(data_ + off, clamp);
418 }
419
425 NEFORCE_NODISCARD constexpr basic_string_view head(const size_type count = npos) const { return substr(0, count); }
426
432 NEFORCE_NODISCARD constexpr basic_string_view tail(const size_type off = 0) const { return substr(off); }
433
440 NEFORCE_NODISCARD constexpr basic_string_view view(const size_type off, const size_type count = npos) const {
441 return substr(off, count);
442 }
443
449 NEFORCE_NODISCARD constexpr int compare(const basic_string_view view) const noexcept {
450 return (char_traits_compare<Traits>) (data_, size_, view.data_, view.size_);
451 }
452
460 NEFORCE_NODISCARD constexpr int compare(const size_type off, const size_type n,
461 const basic_string_view view) const {
462 return substr(off, n).compare(view);
463 }
464
474 NEFORCE_NODISCARD constexpr int compare(const size_type off, const size_type n, const basic_string_view view,
475 const size_type roff, const size_type count) const {
476 return substr(off, n).compare(view.substr(roff, count));
477 }
478
484 NEFORCE_NODISCARD constexpr int compare(const CharT* const str) const noexcept {
485 return compare(basic_string_view(str));
486 }
487
495 NEFORCE_NODISCARD constexpr int compare(const size_type off, const size_type n, const CharT* const str) const {
496 return substr(off, n).compare(basic_string_view(str));
497 }
498
507 NEFORCE_NODISCARD constexpr int compare(const size_type off, const size_type n, const CharT* const str,
508 const size_type count) const {
509 return substr(off, n).compare(basic_string_view(str, count));
510 }
511
517 NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 int compare_ignore_case(const basic_string_view view) const noexcept {
518 const size_type min_len = _NEFORCE min(size_, view.size_);
519 for (size_type i = 0; i < min_len; ++i) {
520 const auto lc = _NEFORCE to_lowercase(data_[i]);
521 const auto rc = _NEFORCE to_lowercase(view.data_[i]);
522 if (lc != rc) {
523 return (lc < rc) ? -1 : 1;
524 }
525 }
526 if (size_ < view.size_) {
527 return -1;
528 }
529 if (size_ > view.size_) {
530 return 1;
531 }
532 return 0;
533 }
534
540 NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 int compare_ignore_case(const_pointer str) const noexcept {
541 return this->compare_ignore_case(basic_string_view(str));
542 }
543
550 NEFORCE_NODISCARD constexpr size_type find(const basic_string_view view, const size_type n = 0) const noexcept {
551 return (char_traits_find<Traits>) (data_, size_, n, view.data_, view.size_);
552 }
553
560 NEFORCE_NODISCARD constexpr size_type find(const CharT chr, const size_type n = 0) const noexcept {
561 return (char_traits_find_char<Traits>) (data_, size_, n, chr);
562 }
563
571 NEFORCE_NODISCARD constexpr size_type find(const CharT* const str, const size_type off,
572 const size_type count) const noexcept {
573 return (char_traits_find<Traits>) (data_, size_, off, str, count);
574 }
575
582 NEFORCE_NODISCARD constexpr size_type find(const CharT* const str, const size_type off = 0) const noexcept {
583 return (char_traits_find<Traits>) (data_, size_, off, str, Traits::length(str));
584 }
585
592 NEFORCE_NODISCARD constexpr size_type rfind(const basic_string_view view,
593 const size_type off = npos) const noexcept {
594 return (char_traits_rfind<Traits>) (data_, size_, off, view.data_, view.size_);
595 }
596
603 NEFORCE_NODISCARD constexpr size_type rfind(const CharT chr, const size_type n = npos) const noexcept {
604 return (char_traits_rfind_char<Traits>) (data_, size_, n, chr);
605 }
606
614 NEFORCE_NODISCARD constexpr size_type rfind(const CharT* const str, const size_type off,
615 const size_type n) const noexcept {
616 return (char_traits_rfind<Traits>) (data_, size_, off, str, n);
617 }
618
625 NEFORCE_NODISCARD constexpr size_type rfind(const CharT* const str, const size_type off = npos) const noexcept {
626 return (char_traits_rfind<Traits>) (data_, size_, off, str, Traits::length(str));
627 }
628
635 NEFORCE_NODISCARD constexpr size_type find_first_of(const basic_string_view view,
636 const size_type off = 0) const noexcept {
637 return (char_traits_find_first_of<Traits>) (data_, size_, off, view.data_, view.size_);
638 }
639
646 NEFORCE_NODISCARD constexpr size_type find_first_of(const CharT chr, const size_type off = 0) const noexcept {
647 return (char_traits_find_char<Traits>) (data_, size_, off, chr);
648 }
649
657 NEFORCE_NODISCARD constexpr size_type find_first_of(const CharT* const str, const size_type off,
658 const size_type n) const noexcept {
659 return (char_traits_find_first_of<Traits>) (data_, size_, off, str, n);
660 }
661
668 NEFORCE_NODISCARD constexpr size_type find_first_of(const CharT* const str,
669 const size_type off = 0) const noexcept {
670 return (char_traits_find_first_of<Traits>) (data_, size_, off, str, Traits::length(str));
671 }
672
679 NEFORCE_NODISCARD constexpr size_type find_last_of(const basic_string_view view,
680 const size_type off = npos) const noexcept {
681 return (char_traits_find_last_of<Traits>) (data_, size_, off, view.data_, view.size_);
682 }
683
690 NEFORCE_NODISCARD constexpr size_type find_last_of(const CharT chr, const size_type off = npos) const noexcept {
691 return (char_traits_rfind_char<Traits>) (data_, size_, off, chr);
692 }
693
701 NEFORCE_NODISCARD constexpr size_type find_last_of(const CharT* const str, const size_type off,
702 const size_type n) const noexcept {
703 return (char_traits_find_last_of<Traits>) (data_, size_, off, str, n);
704 }
705
712 NEFORCE_NODISCARD constexpr size_type find_last_of(const CharT* const str,
713 const size_type off = npos) const noexcept {
714 return (char_traits_find_last_of<Traits>) (data_, size_, off, str, Traits::length(str));
715 }
716
723 NEFORCE_NODISCARD constexpr size_type find_first_not_of(const basic_string_view view,
724 const size_type off = 0) const noexcept {
725 return (char_traits_find_first_not_of<Traits>) (data_, size_, off, view.data_, view.size_);
726 }
727
734 NEFORCE_NODISCARD constexpr size_type find_first_not_of(const CharT chr, const size_type off = 0) const noexcept {
735 return (char_traits_find_not_char<Traits>) (data_, size_, off, chr);
736 }
737
745 NEFORCE_NODISCARD constexpr size_type find_first_not_of(const CharT* const str, const size_type off,
746 const size_type n) const noexcept {
747 return (char_traits_find_first_not_of<Traits>) (data_, size_, off, str, n);
748 }
749
756 NEFORCE_NODISCARD constexpr size_type find_first_not_of(const CharT* const str,
757 const size_type off = 0) const noexcept {
758 return (char_traits_find_first_not_of<Traits>) (data_, size_, off, str, Traits::length(str));
759 }
760
767 NEFORCE_NODISCARD constexpr size_type find_last_not_of(const basic_string_view view,
768 const size_type off = npos) const noexcept {
769 return (char_traits_find_last_not_of<Traits>) (data_, size_, off, view.data_, view.size_);
770 }
771
778 NEFORCE_NODISCARD constexpr size_type find_last_not_of(const CharT chr, const size_type off = npos) const noexcept {
779 return (char_traits_rfind_not_char<Traits>) (data_, size_, off, chr);
780 }
781
789 NEFORCE_NODISCARD constexpr size_type find_last_not_of(const CharT* const str, const size_type off,
790 const size_type n) const noexcept {
791 return (char_traits_find_last_not_of<Traits>) (data_, size_, off, str, n);
792 }
793
800 NEFORCE_NODISCARD constexpr size_type find_last_not_of(const CharT* const str,
801 const size_type off = npos) const noexcept {
802 return (char_traits_find_last_not_of<Traits>) (data_, size_, off, str, Traits::length(str));
803 }
804
811 NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 size_type count(value_type chr, const size_type position = 0) const noexcept {
812 size_type n = 0;
813 for (size_type idx = position; idx < size_; ++idx) {
814 if (*(data() + idx) == chr) {
815 ++n;
816 }
817 }
818 return n;
819 }
820
826 NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 bool starts_with(const basic_string_view view) const noexcept {
827 return view.size() <= size_ && traits_type::compare(data(), view.data(), view.size()) == 0;
828 }
829
835 NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 bool starts_with(value_type chr) const noexcept {
836 return !empty() && traits_type::eq(front(), chr);
837 }
838
844 NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 bool starts_with(const_pointer str) const noexcept {
845 return this->starts_with(basic_string_view(str));
846 }
847
853 NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 bool ends_with(const basic_string_view view) const noexcept {
854 const size_type view_size = view.size();
855 return view_size <= size_ && traits_type::compare(data_ + size_ - view_size, view.data(), view_size) == 0;
856 }
857
863 NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 bool ends_with(value_type chr) const noexcept {
864 return !empty() && traits_type::eq(back(), chr);
865 }
866
872 NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 bool ends_with(const_pointer str) const noexcept {
873 return this->ends_with(basic_string_view(str));
874 }
875
881 NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 bool contains(const basic_string_view view) const noexcept {
882 return this->find(view) != npos;
883 }
884
890 NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 bool contains(value_type chr) const noexcept {
891 return this->find(chr) != npos;
892 }
893
899 NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 bool contains(const_pointer str) const noexcept {
900 return this->find(str) != npos;
901 }
902
907 NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 basic_string_view trim_left() const noexcept {
908 return this->trim_left_if([](value_type ch) { return _NEFORCE is_space(ch); });
909 }
910
915 NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 basic_string_view trim_right() const noexcept {
916 return this->trim_right_if([](value_type ch) { return _NEFORCE is_space(ch); });
917 }
918
923 NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 basic_string_view trim() const noexcept {
924 return this->trim_left().trim_right();
925 }
926
933 template <typename Predicate>
934 NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 basic_string_view trim_left_if(Predicate pred) const
935 noexcept(noexcept(pred(*cbegin()))) {
936 if (empty()) {
937 return *this;
938 }
939
940 const_iterator it = cbegin();
941 while (it != cend() && pred(*it)) {
942 ++it;
943 }
944
945 if (it != cbegin()) {
946 return basic_string_view(data_ + (it - cbegin()), size_ - (it - cbegin()));
947 }
948
949 return *this;
950 }
951
958 template <typename Predicate>
959 NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 basic_string_view trim_right_if(Predicate pred) const
960 noexcept(noexcept(pred(*crbegin()))) {
961 if (empty()) {
962 return *this;
963 }
964
966 while (rit != crend() && pred(*rit)) {
967 ++rit;
968 }
969
970 if (rit != crbegin()) {
971 return basic_string_view(data_, size_ - (rit - crbegin()));
972 }
973
974 return *this;
975 }
976
983 template <typename Predicate>
984 NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 basic_string_view trim_if(Predicate pred) const
985 noexcept(noexcept(this->trim_right_if(pred)) && noexcept(this->trim_left_if(pred))) {
986 return this->trim_left_if(pred).trim_right_if(pred);
987 }
988
994 NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 bool equal_to(const basic_string_view str) const noexcept {
995 return (char_traits_equal<Traits>) (data_, size_, str.data_, str.size_);
996 }
997
1003 NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 bool equal_to(const CharT* str) const noexcept {
1004 return equal_to(basic_string_view(str));
1005 }
1006
1011 constexpr void swap(basic_string_view& view) noexcept {
1012 const basic_string_view tmp(view);
1013 view = *this;
1014 *this = tmp;
1015 }
1016
1022 NEFORCE_NODISCARD constexpr bool less_than(const basic_string_view& rhs) const noexcept {
1023 return this->compare(rhs) < 0;
1024 }
1025
1030 NEFORCE_NODISCARD constexpr size_t to_hash() const noexcept {
1031 return _NEFORCE FNV_hash_string(this->data(), this->length());
1032 }
1033};
1034
1035#ifndef NEFORCE_STANDARD_17
1036template <typename CharT, typename Traits>
1038#endif
1039
1040#ifndef NEFORCE_COMPILER_CLANG_CL
1041extern template class basic_string_view<char>;
1042extern template class basic_string_view<wchar_t>;
1043# ifdef NEFORCE_STANDARD_20
1044extern template class basic_string_view<char8_t>;
1045# endif
1046extern template class basic_string_view<char16_t>;
1047extern template class basic_string_view<char32_t>;
1048#endif
1049 // StringView
1051
1052NEFORCE_END_NAMESPACE__
1053#endif // NEFORCE_CORE_STRING_BASIC_STRING_VIEW_HPP__
字符特征模板
字符类型分类和转换函数
基本字符串视图模板
constexpr bool less_than(const basic_string_view &rhs) const noexcept
小于比较操作符
constexpr size_type rfind(const CharT *const str, const size_type off=npos) const noexcept
从后向前查找C风格字符串
constexpr int compare_ignore_case(const_pointer str) const noexcept
忽略大小写与C风格字符串三路比较
constexpr size_type find_last_of(const CharT *const str, const size_type off, const size_type n) const noexcept
查找最后一个出现在指定字符集合中的字符
constexpr basic_string_view trim_right() const noexcept
去除右侧空白字符
constexpr basic_string_view view(const size_type off, const size_type count=npos) const
获取子视图
constexpr const_reference front() const noexcept
访问第一个字符
constexpr size_type find_last_of(const CharT *const str, const size_type off=npos) const noexcept
查找最后一个出现在C风格字符串集合中的字符
constexpr size_type find_last_not_of(const CharT *const str, const size_type off=npos) const noexcept
查找最后一个不在C风格字符串集合中的字符
constexpr basic_string_view trim_left() const noexcept
去除左侧空白字符
constexpr int compare(const size_type off, const size_type n, const CharT *const str) const
比较子串与C风格字符串
constexpr int compare(const size_type off, const size_type n, const basic_string_view view) const
比较子串与字符串视图
_NEFORCE reverse_iterator< const_iterator > const_reverse_iterator
constexpr size_t to_hash() const noexcept
计算哈希值
constexpr bool starts_with(const_pointer str) const noexcept
检查是否以C风格字符串开头
constexpr const_pointer data() const noexcept
获取底层数据指针
constexpr size_type find_first_not_of(const CharT *const str, const size_type off, const size_type n) const noexcept
查找第一个不在指定字符集合中的字符
constexpr int compare(const size_type off, const size_type n, const CharT *const str, const size_type count) const
比较子串与指定长度的字符数组
constexpr bool equal_to(const CharT *str) const noexcept
与C风格字符串相等比较
constexpr size_type find_last_not_of(const basic_string_view view, const size_type off=npos) const noexcept
查找最后一个不在字符集合中的字符
constexpr size_type count(value_type chr, const size_type position=0) const noexcept
constexpr size_type find_first_not_of(const CharT chr, const size_type off=0) const noexcept
查找第一个不等于指定字符的位置
constexpr bool contains(const basic_string_view view) const noexcept
检查是否包含指定视图
constexpr bool ends_with(value_type chr) const noexcept
检查是否以指定字符结尾
constexpr bool ends_with(const_pointer str) const noexcept
检查是否以C风格字符串结尾
constexpr basic_string_view tail(const size_type off=0) const
获取尾部子串
constexpr size_type find_last_not_of(const CharT chr, const size_type off=npos) const noexcept
查找最后一个不等于指定字符的位置
constexpr basic_string_view trim_right_if(Predicate pred) const noexcept(noexcept(pred(*crbegin())))
根据谓词去除右侧字符
constexpr size_type rfind(const CharT *const str, const size_type off, const size_type n) const noexcept
从后向前查找指定长度的子串
constexpr size_type max_size() const noexcept
获取最大可能长度
constexpr const_iterator cend() const noexcept
获取常量结束迭代器
constexpr bool empty() const noexcept
检查是否为空
constexpr const_iterator end() const noexcept
获取结束迭代器
constexpr size_type find_first_of(const CharT *const str, const size_type off, const size_type n) const noexcept
查找第一个出现在指定字符集合中的字符
constexpr basic_string_view trim() const noexcept
去除两侧空白字符
constexpr basic_string_view substr(const size_type off=0, const size_type count=npos) const
获取子视图
constexpr const_reverse_iterator crbegin() const noexcept
获取常量反向起始迭代器
constexpr const_reverse_iterator crend() const noexcept
获取常量反向结束迭代器
constexpr size_type find(const CharT *const str, const size_type off=0) const noexcept
查找C风格字符串
constexpr size_type copy(CharT *const str, size_type count, const size_type off=0) const
复制字符到目标缓冲区
constexpr int compare(const basic_string_view view) const noexcept
比较字符串视图
constexpr size_type find(const CharT chr, const size_type n=0) const noexcept
查找字符
constexpr int compare(const CharT *const str) const noexcept
比较与C风格字符串
constexpr const_iterator cbegin() const noexcept
获取常量起始迭代器
constexpr basic_string_view trim_if(Predicate pred) const noexcept(noexcept(this->trim_right_if(pred)) &&noexcept(this->trim_left_if(pred)))
根据谓词去除两侧字符
constexpr const_reference operator[](const size_type n) const noexcept
下标访问操作符
constexpr basic_string_view(const_pointer str, const size_type n) noexcept
从字符数组构造(指定长度)
constexpr const_reference back() const noexcept
访问最后一个字符
constexpr size_type find(const CharT *const str, const size_type off, const size_type count) const noexcept
查找指定长度的子串
constexpr size_type find(const basic_string_view view, const size_type n=0) const noexcept
查找子串
constexpr size_type find_first_of(const CharT chr, const size_type off=0) const noexcept
查找第一个等于指定字符的位置
constexpr const_reference at(const size_type n) const
带边界检查的访问
constexpr void remove_suffix(const size_type n) noexcept
移除后缀
constexpr const_reverse_iterator rbegin() const noexcept
获取反向起始迭代器
constexpr bool equal_to(const basic_string_view str) const noexcept
相等比较
constexpr const_reverse_iterator rend() const noexcept
获取反向结束迭代器
constexpr basic_string_view(Iterator start, Iterator finish)
从迭代器范围构造
constexpr int compare(const size_type off, const size_type n, const basic_string_view view, const size_type roff, const size_type count) const
比较子串与另一个子串
constexpr size_type find_last_not_of(const CharT *const str, const size_type off, const size_type n) const noexcept
查找最后一个不在指定字符集合中的字符
constexpr size_type find_first_not_of(const CharT *const str, const size_type off=0) const noexcept
查找第一个不在C风格字符串集合中的字符
constexpr size_type find_last_of(const CharT chr, const size_type off=npos) const noexcept
查找最后一个等于指定字符的位置
constexpr size_type find_first_not_of(const basic_string_view view, const size_type off=0) const noexcept
查找第一个不在字符集合中的字符
constexpr bool contains(const_pointer str) const noexcept
检查是否包含C风格字符串
constexpr size_type rfind(const basic_string_view view, const size_type off=npos) const noexcept
从后向前查找子串
constexpr bool ends_with(const basic_string_view view) const noexcept
检查是否以指定视图结尾
constexpr bool contains(value_type chr) const noexcept
检查是否包含指定字符
constexpr bool starts_with(value_type chr) const noexcept
检查是否以指定字符开头
constexpr void remove_prefix(const size_type n) noexcept
移除前缀
constexpr void swap(basic_string_view &view) noexcept
交换两个字符串视图
constexpr size_type find_first_of(const basic_string_view view, const size_type off=0) const noexcept
查找第一个出现在字符集合中的字符
constexpr size_type find_first_of(const CharT *const str, const size_type off=0) const noexcept
查找第一个出现在C风格字符串集合中的字符
constexpr size_type find_last_of(const basic_string_view view, const size_type off=npos) const noexcept
查找最后一个出现在字符集合中的字符
constexpr ~basic_string_view() noexcept=default
析构函数
constexpr basic_string_view head(const size_type count=npos) const
获取头部子串
constexpr basic_string_view trim_left_if(Predicate pred) const noexcept(noexcept(pred(*cbegin())))
根据谓词去除左侧字符
constexpr int compare_ignore_case(const basic_string_view view) const noexcept
忽略大小写三路比较
constexpr bool starts_with(const basic_string_view view) const noexcept
检查是否以指定视图开头
constexpr size_type rfind(const CharT chr, const size_type n=npos) const noexcept
从后向前查找字符
constexpr bool is_standard_layout_v
is_standard_layout的便捷变量模板
constexpr bool is_array_v
is_array的便捷变量模板
constexpr CharT to_lowercase(const CharT c) noexcept
将字符转换为小写
constexpr size_t char_traits_find_first_of(const char_traits_ptr_t< Traits > dest, const size_t dest_size, const size_t start, const char_traits_ptr_t< Traits > rsc, const size_t rsc_size) noexcept
查找第一个出现在给定集合中的字符(char_traits特化版本)
constexpr size_t char_traits_rfind(const char_traits_ptr_t< Traits > dest, const size_t dest_size, const size_t start, const char_traits_ptr_t< Traits > rsc, const size_t rsc_size) noexcept
从后向前查找子序列
constexpr size_t char_traits_find_last_of(const char_traits_ptr_t< Traits > dest, const size_t dest_size, const size_t start, const char_traits_ptr_t< Traits > rsc, const size_t rsc_size) noexcept
查找最后一个出现在给定集合中的字符(char_traits特化版本)
constexpr size_t char_traits_find_last_not_of(const char_traits_ptr_t< Traits > dest, const size_t dest_size, const size_t start, const char_traits_ptr_t< Traits > rsc, const size_t rsc_size) noexcept
查找最后一个不在给定集合中的字符(char_traits特化版本)
constexpr size_t char_traits_rfind_char(const char_traits_ptr_t< Traits > dest, const size_t dest_size, const size_t start, const char_traits_char_t< Traits > chr) noexcept
从后向前查找单个字符
constexpr size_t char_traits_rfind_not_char(const char_traits_ptr_t< Traits > dest, const size_t dest_size, const size_t start, const char_traits_char_t< Traits > chr) noexcept
查找最后一个不等于指定字符的位置
constexpr int char_traits_compare(const char_traits_ptr_t< Traits > lhs, const size_t lh_size, const char_traits_ptr_t< Traits > rhs, const size_t rh_size) noexcept
比较两个字符序列(三路比较)
constexpr size_t char_traits_find(const char_traits_ptr_t< Traits > dest, const size_t dest_size, const size_t start, const char_traits_ptr_t< Traits > rsc, const size_t rsc_size) noexcept
在字符序列中查找子序列
constexpr size_t char_traits_find_not_char(const char_traits_ptr_t< Traits > dest, const size_t dest_size, const size_t start, const char_traits_char_t< Traits > chr) noexcept
查找第一个不等于指定字符的位置
constexpr size_t char_traits_find_first_not_of(const char_traits_ptr_t< Traits > dest, const size_t dest_size, const size_t start, const char_traits_ptr_t< Traits > rsc, const size_t rsc_size) noexcept
查找第一个不在给定集合中的字符(char_traits特化版本)
constexpr size_t char_traits_find_char(const char_traits_ptr_t< Traits > dest, const size_t dest_size, const size_t start, const char_traits_char_t< Traits > chr) noexcept
在字符序列中查找单个字符
constexpr bool char_traits_equal(const char_traits_ptr_t< Traits > lhs, const size_t lh_size, const char_traits_ptr_t< Traits > rhs, const size_t rh_size) noexcept
比较两个字符序列是否相等
constexpr bool is_space(const CharT c) noexcept
检查字符是否为空白字符
constexpr T clamp(const T &value, const T &lower, const T &upper, Compare comp) noexcept(noexcept(comp(value, lower)))
将值限制在指定范围内
constexpr const T & min(const T &a, const T &b, Compare comp) noexcept(noexcept(comp(b, a)))
返回两个值中的较小者
constexpr size_t FNV_hash_string(const CharT *str, const size_t len) noexcept
字符串类型的FNV哈希
constexpr iter_difference_t< Iterator > distance(Iterator first, Iterator last)
计算两个迭代器之间的距离
uint64_t size_t
无符号大小类型
int64_t ptrdiff_t
指针差类型
constexpr decltype(auto) size(const Container &cont) noexcept(noexcept(cont.size()))
获取容器的大小
constexpr decltype(auto) data(Container &cont) noexcept(noexcept(cont.data()))
获取容器的底层数据指针
constexpr bool is_trivial_v
is_trivial的便捷变量模板
constexpr bool is_same_v
is_same的便捷变量模板
迭代器接口
constexpr reference dereference() const noexcept
解引用操作
constexpr void decrement() noexcept
递减操作
constexpr pointer base() const noexcept
获取底层指针
constexpr difference_type distance_to(const basic_string_view_iterator &other) const noexcept
计算距离操作
constexpr void increment() noexcept
递增操作
typename container_type::difference_type difference_type
差值类型
constexpr void advance(difference_type off) noexcept
前进操作
typename container_type::const_pointer pointer
指针类型
typename container_type::value_type value_type
值类型
basic_string_view< typename Traits::char_type, Traits > container_type
容器类型
contiguous_iterator_tag iterator_category
迭代器类别
typename container_type::const_reference reference
引用类型
typename container_type::size_type size_type
大小类型
constexpr reference operator[](const difference_type n) const noexcept
下标访问操作符
constexpr bool equal_to(const basic_string_view_iterator &rhs) const noexcept
相等比较
constexpr bool less_than(const basic_string_view_iterator &rhs) const noexcept
小于比较
连续迭代器标签
通用接口,同时具备可比较和可哈希功能
迭代器接口模板