Збільшення покажчиків є ідіоматичним C ++, оскільки семантика покажчиків відображає фундаментальний аспект філософії дизайну, що стоїть за стандартною бібліотекою C ++ (заснована на STL Олександра Степанова )
Тут важливою концепцією є те, що STL розроблений навколо контейнерів, алгоритмів та ітераторів. Покажчики - просто ітератори .
Звичайно, можливість збільшення (або додавання / віднімання з) покажчиків повертається до C. Багато алгоритмів маніпулювання C-рядками можна записати просто за допомогою арифметики вказівника. Розглянемо наступний код:
char string1[4] = "abc";
char string2[4];
char* src = string1;
char* dest = string2;
while ((*dest++ = *src++));
Цей код використовує арифметику вказівника для копіювання нульового завершення C-рядка. Цикл автоматично припиняється, коли він стикається з нулем.
За допомогою C ++ семантика вказівників узагальнена до поняття ітераторів . Більшість контейнерів стандарту C ++ забезпечують ітератори, які можуть бути доступні через begin
та end
член функцій. Ітератори поводяться як вказівники, оскільки вони можуть збільшуватися, дереференціюватися, а іноді і зменшуватися, або просуватися.
Щоб повторити std::string
, ми б сказали:
std::string s = "abcdef";
std::string::iterator it = s.begin();
for (; it != s.end(); ++it) std::cout << *it;
Ми збільшуємо ітератор так, як ми збільшуємо вказівник на звичайний C-рядок. Причина, що ця концепція є потужною, полягає в тому, що ви можете використовувати шаблони для написання функцій, які працюватимуть для будь-якого типу ітератора, який відповідає необхідним вимогам концепції. І це сила STL:
std::string s1 = "abcdef";
std::vector<char> buf;
std::copy(s1.begin(), s1.end(), std::back_inserter(buf));
Цей код копіює рядок у вектор. copy
Функція являє собою шаблон , який буде працювати з будь-яким ітератора , який підтримує збільшується (який включає в себе прості покажчики). Ми могли б використовувати ту саму copy
функцію на звичайному C-рядку:
const char* s1 = "abcdef";
std::vector<char> buf;
std::copy(s1, s1 + std::strlen(s1), std::back_inserter(buf));
Ми могли б використовувати copy
на умовах std::map
або std::set
або будь-який призначений для користувача контейнер , який підтримує ітератори.
Зверніть увагу , що покажчики типу конкретного ітератора: випадковий итератор доступу , що означає , що вони підтримують збільшення, декремент і просування вперед з +
і -
оператором. Інші типи ітераторів підтримують лише підмножину семантики вказівників: двонаправлений ітератор підтримує принаймні збільшення та декрементацію; а вперед ітератори підтримує , щонайменше , приріст. (Усі типи ітераторів підтримують перенаправлення.) copy
Функція вимагає ітератора, який принаймні підтримує збільшення.
Про різні концепції ітератора ви можете прочитати тут .
Отже, збільшувальні покажчики - це ідіоматичний спосіб C ++ для ітерації через C-масив або доступу до елементів / зсувів у C-масиві.