Chuyển tới nội dung chính

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ếu sublen lớn hơn số ký tự còn lại từ subpos, hoặc nếu sublenstd::string::npos (giá trị mặc định), toàn bộ phần còn lại của str 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

  1. 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.
  2. 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().
  3. replace() có thể làm thay đổi size()capacity() của chuỗi.
  4. 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.
  5. 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ếu pos hoặc subpos vượt quá phạm vi).
  6. 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.
  7. Phiên bản 7 (initializer_list) được hỗ trợ từ C++11.
  8. 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

insertChè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
appendNối thêm nội dung vào cuối chuỗi hiện tại
substrTrích xuất một chuỗi con từ một chuỗi std::string hiện có
eraseXóa bỏ một phần hoặc toàn bộ nội dung của chuỗi
assignGán nội dung mới cho chuỗi, thay thế nội dung hiện tại của nó