Con trỏ tăng là C ++ thành ngữ, bởi vì ngữ nghĩa con trỏ phản ánh một khía cạnh cơ bản của triết lý thiết kế đằng sau thư viện chuẩn C ++ (dựa trên STL của Alexander Stepanov )
Khái niệm quan trọng ở đây, là STL được thiết kế xung quanh các thùng chứa, thuật toán và các trình vòng lặp. Con trỏ chỉ đơn giản là các vòng lặp .
Tất nhiên, khả năng tăng (hoặc cộng / trừ từ) con trỏ trở lại C. Rất nhiều thuật toán thao tác chuỗi C có thể được viết đơn giản bằng cách sử dụng số học con trỏ. Hãy xem xét các mã sau đây:
char string1[4] = "abc";
char string2[4];
char* src = string1;
char* dest = string2;
while ((*dest++ = *src++));
Mã này sử dụng số học con trỏ để sao chép chuỗi C kết thúc null. Vòng lặp tự động chấm dứt khi nó gặp null.
Với C ++, ngữ nghĩa con trỏ được khái quát hóa theo khái niệm của các trình vòng lặp . Hầu hết các bộ chứa C ++ tiêu chuẩn đều cung cấp các trình vòng lặp, có thể được truy cập thông qua các hàm begin
và end
thành viên. Các trình vòng lặp hoạt động giống như các con trỏ, theo đó chúng có thể được tăng lên, hủy đăng ký và đôi khi giảm dần hoặc nâng cao.
Để lặp lại qua một std::string
, chúng tôi sẽ nói:
std::string s = "abcdef";
std::string::iterator it = s.begin();
for (; it != s.end(); ++it) std::cout << *it;
Chúng tôi tăng iterator giống như chúng tôi sẽ tăng một con trỏ tới một chuỗi C đơn giản. Lý do khái niệm này mạnh mẽ là vì bạn có thể sử dụng các mẫu để viết các hàm sẽ hoạt động cho bất kỳ loại trình vòng lặp nào đáp ứng các yêu cầu khái niệm cần thiết. Và đây là sức mạnh của STL:
std::string s1 = "abcdef";
std::vector<char> buf;
std::copy(s1.begin(), s1.end(), std::back_inserter(buf));
Mã này sao chép một chuỗi thành một vector. Các copy
chức năng là một mẫu mà sẽ làm việc với bất kỳ iterator rằng hỗ trợ incrementing (bao gồm con trỏ đồng bằng). Chúng ta có thể sử dụng cùng copy
chức năng trên một chuỗi C đơn giản:
const char* s1 = "abcdef";
std::vector<char> buf;
std::copy(s1, s1 + std::strlen(s1), std::back_inserter(buf));
Chúng tôi có thể sử dụng copy
trên một std::map
hoặc một std::set
hoặc bất kỳ vùng chứa tùy chỉnh nào hỗ trợ các trình vòng lặp.
Lưu ý rằng con trỏ là một loại trình vòng lặp cụ thể: Trình lặp truy cập ngẫu nhiên , có nghĩa là chúng hỗ trợ tăng, giảm và tiến với toán tử +
và -
toán tử. Các kiểu trình vòng lặp khác chỉ hỗ trợ một tập hợp con về ngữ nghĩa con trỏ: một trình vòng lặp hai chiều hỗ trợ ít nhất là tăng và giảm; một iterator chuyển tiếp hỗ trợ ít nhất là tăng. (Tất cả các loại trình vòng lặp đều hỗ trợ hội thảo.) copy
Hàm yêu cầu một trình vòng lặp ít nhất hỗ trợ tăng dần.
Bạn có thể đọc về các khái niệm lặp khác nhau ở đây .
Vì vậy, tăng con trỏ là một cách thành ngữ C ++ để lặp lại trên một mảng C hoặc truy cập các phần tử / offset trong một mảng C.