Nối một chuỗi lặp lại n lần. Người dùng nhập chuỗi và số lần n.
Thuật toán
concatStrNTimes(str, n):
res = ""
for i = 1 to n:
res += str
return res
end
Code cơ bản
#include <iostream>
#include <string>
using namespace std;
int main() {
string str, result = "";
int n;
cout << "Nhap chuoi: ";
cin >> str; // Chỉ đọc đến space
cout << "Nhap so lan noi: ";
cin >> n;
for(int i = 0; i < n; i++)
result += str;
cout << "Ket qua: " << result;
return 0;
}
Kết quả
Nhap chuoi: Hello Nhap so lan noi: 5 Ket qua: HelloHelloHelloHelloHello
Cải tiến quan trọng
#include <iostream>
#include <string>
using namespace std;
int main() {
string str;
int n;
cout << "Nhap chuoi (co the co space): ";
cin.ignore(); // Xóa newline còn sót
getline(cin, str); // Đọc cả dòng
cout << "Nhap so lan noi: ";
cin >> n;
string result;
result.reserve(str.length() * n); // Quan trọng: dự trữ bộ nhớ
for(int i = 0; i < n; i++)
result += str;
cout << "Ket qua: " << result;
return 0;
}
Tại sao cần reserve()?
Không có reserve: mỗi += có thể reallocate, copy dữ liệu cũ → O(n²) tổng cộng.
Có reserve: cấp phát một lần, O(n) tổng cộng.
Phiên bản một dòng (C++23)
// C++23: std::string::repeat (chưa chuẩn hóa rộng rãi)
// Hiện tại có thể tự viết:
string repeat(const string& s, int n) {
string r; r.reserve(s.size() * n);
while(n--) r += s;
return r;
}
Lưu ý
- Dùng
getlineđể đọc chuỗi có khoảng trắng. - Luôn
reserve()khi biết trước kích thước cuối. - Tránh
result = result + str(tạo temporary), dùngresult += str.