std::string::replace
#include <string>
// (1) Thay thế một phần bằng chuỗi string khác
string& replace( size_type pos, size_type count, const string& str );
// (2) Thay thế một phần bằng một phần của chuỗi string khác
string& replace( size_type pos, size_type count, const string& str,
size_type subpos, size_type sublen = npos );
// (3) Thay thế một phần bằng chuỗi ký tự C-style
string& replace( size_type pos, size_type count, const charT* s );
// (4) Thay thế một phần bằng một phần của chuỗi ký tự C-style
string& replace( size_type pos, size_type count, const charT* s, size_type n );
// (5) Thay thế một phần bằng một ký tự lặp lại nhiều lần
string& replace( size_type pos, size_type count, size_type n, charT c );
// (6) Thay thế một phần bằng một phạm vi (range)
template< class InputIt >
string& replace( const_iterator i1, const_iterator i2, InputIt first, InputIt last );
// (7) Thay thế một phần bằng một initializer list (từ C++11)
string& replace( const_iterator i1, const_iterator i2, std::initializer_list<charT> ilist );
// (8) Thay thế một phần bằng một ký tự
string& replace( const_iterator i1, const_iterator i2, size_type n, charT c );
// (9) Thay thế một phần bằng một chuỗi ký tự C-style
string& replace( const_iterator i1, const_iterator i2, const charT* s );
// (10) Thay thế một phần bằng một chuỗi string
string& replace(const_iterator i1, const_iterator i2, const basic_string& str);
Thay thế một phần của chuỗi bằng một nội dung mới. Nó cung cấp nhiều tùy chọn linh hoạt để thay thế một phạm vi con (substring) bằng chuỗi khác, chuỗi ký tự C-style, ký tự lặp lại, hoặc một phạm vi được xác định bởi iterator.
Tham số
pos
- Vị trí (index) bắt đầu phần chuỗi cần thay thế (phiên bản 1-5).
count
- Số lượng ký tự cần thay thế, bắt đầu từ
pos
(phiên bản 1-5).
str
- Chuỗi std::string dùng để thay thế (phiên bản 1, 2, 10).
subpos
- Vị trí bắt đầu của chuỗi con trong
str
dùng để thay thế (phiên bản 2).
sublen
- Số lượng ký tự của chuỗi con trong
str
dùng để thay thế, bắt đầu từsubpos
(phiên bản 2). Nếusublen
lớn hơn số ký tự còn lại từsubpos
, hoặc nếusublen
là std::string::npos (giá trị mặc định), toàn bộ phần còn lại củastr
tính từsubpos
sẽ được sử dụng.
s
- Con trỏ đến chuỗi ký tự C-style (kết thúc bằng ký tự null) dùng để thay thế (phiên bản 3, 4, 9).
n
- Số lượng ký tự đầu tiên từ chuỗi ký tự C-style
s
dùng để thay thế (phiên bản 4). - Số lần lặp lại ký tự
c
(phiên bản 5, 8).
c
- Ký tự dùng để thay thế (phiên bản 5, 8).
i1
- Iterator trỏ đến phần tử đầu tiên trong phạm vi cần thay thế (phiên bản 6, 7, 8, 9, 10).
i2
- Iterator trỏ đến phần tử ngay sau phần tử cuối cùng trong phạm vi cần thay thế (phiên bản 6, 7, 8, 9, 10).
first
- Input Iterator trỏ đến phần tử đầu tiên trong phạm vi dùng để thay thế (phiên bản 6).
last
- Input Iterator trỏ đến phần tử ngay sau phần tử cuối cùng trong phạm vi dùng để thay thế (phiên bản 6).
ilist
- initializer_list chứa các ký tự dùng để thay thế (phiên bản 7).
Giá trị trả về
*this
- Tham chiếu đến chính đối tượng std::string hiện tại sau khi đã thực hiện phép thay thế.
Đặc điểm
replace()
thay đổi trực tiếp nội dung của chuỗi, không tạo ra một chuỗi mới.- std::string tự động quản lý bộ nhớ, bạn không cần phải lo lắng về việc cấp phát hay giải phóng bộ nhớ khi sử dụng
replace()
. replace()
có thể làm thay đổisize()
vàcapacity()
của chuỗi.- Nếu
replace()
gây ra việc cấp phát lại bộ nhớ, nó có thể làm vô hiệu hóa (invalidate) tất cả các iterator, con trỏ và tham chiếu đến các phần tử của chuỗi. - Các phiên bản của
replace()
có thể ném ra ngoại lệ nếu có lỗi xảy ra (ví dụ: std::bad_alloc nếu không thể cấp phát đủ bộ nhớ, std::length_error nếu độ dài kết quả vượt quámax_size()
, std::out_of_range nếupos
hoặcsubpos
vượt quá phạm vi). - Khi sử dụng phiên bản 6, 7, 8, 9, 10, iterator
i1
,i2
truyền vào phải là iterator hợp lệ của chuỗi hiện tại. - Phiên bản 7 (initializer_list) được hỗ trợ từ C++11.
replace()
thường được sử dụng để:- Thay thế một phần của chuỗi bằng một chuỗi khác.
- Thay thế một phần của chuỗi bằng một chuỗi ký tự C-style.
- Thay thế một phần của chuỗi bằng một ký tự lặp lại nhiều lần.
- Thay thế một phần của chuỗi bằng nội dung của một phạm vi (range).
- Biến đổi chuỗi dựa trên các quy tắc thay thế phức tạp.
Ví dụ
#include <iostream>
#include <string>
#include <vector>
int main() {
std::string str = "This is a test string.";
// (1) Thay thế một phần bằng chuỗi string khác
str.replace(10, 4, "working"); // Thay thế "test" bằng "working"
std::cout << "str after replace(10, 4, \"working\"): " << str << std::endl;
// (2) Thay thế một phần bằng một phần của chuỗi string khác
std::string str2 = "EXAMPLE";
str.replace(0, 4, str2, 0, 3); // Thay thế "This" bằng "EXA"
std::cout << "str after replace(0, 4, str2, 0, 3): " << str << std::endl;
// (3) Thay thế một phần bằng chuỗi ký tự C-style
str.replace(0, 3, "That"); // Thay thế "EXA" bằng "That"
std::cout << "str after replace(0, 3, \"That\"): " << str << std::endl;
// (4) Thay thế một phần bằng một phần của chuỗi ký tự C-style
const char* cstr = "#####";
str.replace(17, 7, cstr, 3); // Thay thế "working" bằng "***"
std::cout << "str after replace(17, 7, cstr, 3): " << str << std::endl;
// (5) Thay thế một phần bằng một ký tự lặp lại nhiều lần
str.replace(0, 4, 4, '-'); // Thay thế "That" bằng "----"
std::cout << "str after replace(0, 4, 4, '-'): " << str << std::endl;
// (6) Thay thế một phần bằng một phạm vi
std::vector<char> vec = {'(', 'O', 'K', ')'};
str.replace(str.begin() + 5, str.begin() + 8, vec.begin(), vec.end()); // Thay thế "is " bằng "(OK)"
std::cout << "str after replace(iterator, iterator, vec.begin(), vec.end()): " << str << std::endl;
// (7) Thay thế một phần bằng một initializer list
str.replace(str.begin() + 5, str.begin() + 9, {'1', '2', '3'});
std::cout << "str after replace(iterator, iterator, {'1', '2', '3'}): " << str << std::endl;
// (8) Thay the một phần bằng một ký tự lặp lại
str.replace(str.begin() + 1, str.begin()+4, 2, '9');
std::cout << "str after replace(str.begin()+1, str.begin()+4, 2, '9'): " << str << std::endl;
// (9) Thay thế một phần bằng một chuỗi ký tự C-style
const char* cstr2 = "C-STYLE";
str.replace(str.begin(), str.begin() + 7, cstr2);
std::cout << "str after replace(str.begin(), str.begin() + 7, cstr2): " << str << std::endl;
// (10) Thay thế một phần bằng một chuỗi string khác
std::string str3 = "STRING";
str.replace(str.begin(), str.begin() + 7, str3);
std::cout << "str after replace(str.begin(), str.begin()+7, str3): " << str << std::endl;
return 0;
}
Các hàm liên quan
insert | Chèn thêm nội dung (ký tự, chuỗi, hoặc phạm vi) vào bên trong chuỗi tại một vị trí xác định |
append | Nối thêm nội dung vào cuối chuỗi hiện tại |
substr | Trích xuất một chuỗi con từ một chuỗi std::string hiện có |
erase | Xóa bỏ một phần hoặc toàn bộ nội dung của chuỗi |
assign | Gán nội dung mới cho chuỗi, thay thế nội dung hiện tại của nó |