std::match_results::cbegin() và cend() (header <regex>) trả về const_iterator để duyệt chỉ đọc (read-only) qua các sub-match.
Cú pháp
const_iterator cbegin() const noexcept; const_iterator cend() const noexcept;
Đặc điểm
cbegin(): Trỏ đến sub-match đầu tiên (group 0).cend(): Trỏ đến vị trí sau sub-match cuối cùng (past-the-end).- Const iterator: Không cho phép sửa đổi sub-match qua iterator.
- Tương đương
begin()/end()nhưng cho const object hoặc read-only access.
Ví dụ 1: Duyệt const match_results
#include <iostream>
#include <string>
#include <regex>
int main() {
std::string str("Tutorials");
std::smatch Mat;
std::regex re("(Tuto)(.*)");
std::regex_match(str, Mat, re);
std::cout << "Match Found:\n";
for (std::smatch::const_iterator it = Mat.cbegin(); it != Mat.cend(); ++it) {
std::cout << *it << '\n';
}
return 0;
}
Đầu ra
Match Found: Tutorials Tuto rials
Ví dụ 2: Duyệt với range-based for (C++11)
#include <bits/stdc++.h>
using namespace std;
void print_matches(const smatch& m) {
// Tự động dùng cbegin/cend vì m là const reference
for (const auto& sub : m) {
cout << "Sub-match: '" << sub << "', length: " << sub.length() << '\n';
}
}
int main() {
string s = "Hello World";
regex r("(\\w+)\\s+(\\w+)");
smatch m;
regex_match(s, m, r);
print_matches(m);
return 0;
}
Đầu ra
Sub-match: 'Hello World', length: 11 Sub-match: 'Hello', length: 5 Sub-match: 'World', length: 5
So sánh các iterator
| Hàm | Trả về | Dùng khi |
|---|---|---|
begin() | iterator | Cần sửa đổi sub_match (hiếm) |
end() | iterator | Sentinel non-const |
cbegin() | const_iterator | Duyệt read-only, const object |
cend() | const_iterator | Sentinel const |
Lưu ý
match_resultsmodel Container (read-only), hỗ trợ range-based for.- Iterator là BidirectionalIterator (hỗ trợ ++, --).
- Dereference iterator trả về
const sub_match<BidirectionalIterator>&. - Không có
rbegin()/rend()cho match_results (C++11-20).