- regex[meta header]
- std[meta namespace]
- function template[meta id-type]
- cpp11[meta cpp]
namespace std {
template <class BiIter>
bool operator<(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs); // (1)
template <class BiIter, class ST, class SA>
bool operator<(
const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& lhs,
const sub_match<BiIter>& rhs); // (2)
template <class BiIter, class ST, class SA>
bool operator<(
const sub_match<BiIter>& lhs,
const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs) // (3)
template <class BiIter>
bool operator<(
const typename iterator_traits<BiIter>::value_type* lhs,
const sub_match<BiIter>& rhs); // (4)
template <class BiIter>
bool operator<(
const sub_match<BiIter>& lhs,
const typename iterator_traits<BiIter>::value_type* rhs); // (5)
template <class BiIter>
bool operator<(
const typename iterator_traits<BiIter>::value_type& lhs,
const sub_match<BiIter>& rhs); // (6)
template <class BiIter>
bool operator<(
const sub_match<BiIter>& lhs,
const typename iterator_traits<BiIter>::value_type& rhs); // (7)
}
左辺が右辺よりも小さいか判定を行う。
- (1)
lhs.
compare
(rhs) < 0
- (2)
rhs.
compare
(typename
sub_match
<BiIter>::string_type(lhs.
data
(), lhs.
size
())) > 0
なお、C++11 の規格書ではrhs.
compare
(lhs.
c_str
()) > 0
となっているが、この式ではlhs
に'\0'
が含まれていた場合に正しく比較することができないため、規格上の誤りとして上記の式に修正された。 - (3)
lhs.
compare
(typename
sub_match
<BiIter>::string_type(rhs.
data
(), rhs.
size
())) < 0
なお、C++11 の規格書ではlhs.
compare
(rhs.
c_str
()) < 0
となっているが、この式ではrhs
に'\0'
が含まれていた場合に正しく比較することができないため、規格上の誤りとして上記の式に修正された。 - (4)
rhs.
compare
(lhs) > 0
- (5)
lhs.
compare
(rhs) < 0
- (6)
rhs.
compare
(typename
sub_match
<BiIter>::string_type(1, lhs)) > 0
- (7)
lhs.
compare
(typename
sub_match
<BiIter>::string_type(1, rhs)) < 0
- (1) の形式でもマッチした文字列のみが比較され、マッチした位置は考慮されない。(例を参照)
- (2)、および、(3) の形式でも比較に使用する文字特性クラスは標準の
char_traits
<value_type>
が使用され、テンプレート引数に指定された文字特性クラスST
は考慮されない。
#include <iostream>
#include <regex>
#include <string>
int main()
{
const char ca[] = "abc abc";
const std::regex re(R"((\w+) (\w+))");
std::cmatch m;
if (std::regex_search(ca, m, re)) {
std::csub_match sub1 = m[1];
std::csub_match sub2 = m[2];
const std::string s1 = "abc";
const std::string s2 = "ABC";
std::cout << std::boolalpha
<< (sub1 < sub2 ) << std::endl // (1) の形式
<< (s1 < sub2 ) << std::endl // (2) の形式
<< (sub1 < s2 ) << std::endl // (3) の形式
<< ("ABC" < sub2 ) << std::endl // (4) の形式
<< (sub1 < "abc") << std::endl // (5) の形式
<< ('A' < sub2 ) << std::endl // (6) の形式
<< (sub1 < 'a' ) << std::endl; // (7) の形式
} else {
std::cout << "not match" << std::endl;
}
}
- std::regex[link ../basic_regex.md]
- std::cmatch[link ../match_results.md]
- std::regex_search[link ../regex_search.md]
- std::csub_match[link ../sub_match.md]
false
false
false
true
false
true
false
- C++11
- Clang: -
- Clang, C++11 mode: 3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6
- GCC: -
- GCC, C++11 mode: 4.9.0, 4.9.1, 5.0.0
- ICC: ??
- Visual C++: ??