Що таке string_view?


162

string_view була запропонована функція в TS + Основи бібліотеки C ++ ( N3921 ), доданого до C ++ 17

Наскільки я розумію, це тип, який представляє якусь строкову "концепцію", це перегляд будь-якого типу контейнера, який міг би зберігати щось видиме як рядок.

  • Чи це правильно ?
  • Чи повинен const std::string&стати тип канонічного параметра string_view?
  • Чи є ще один важливий момент, який string_viewпотрібно взяти до уваги?

4
Нарешті, хтось розуміє, що рядкам потрібна інша семантика, хоча введення string_view - лише невеликий крок.
Джон З. Лі

Відповіді:


183

Мета будь-яких пропозицій "посилання на рядок" та "посилання на масив" полягає в тому, щоб уникнути копіювання даних, які вже належать десь в іншому місці, і для яких потрібен лише вид, який не змінюється. string_viewУ питанні одне таку пропозицію; були раніше названі string_refі array_refтеж.

Ідея полягає у тому, щоб завжди зберігати пару вказівника на перший елемент та розмір деякого існуючого масиву даних або рядка.

Такий клас обробки зображень міг би дешево обійтись за значенням і запропонував би дешеві операції підрядки (які можна реалізувати як прості збільшення кроків вказівника та коригування розміру).

Для багатьох застосувань рядків не потрібне фактичне володіння рядками, а рядком, про який йде мова, часто вже належить хтось інший. Тож існує справжній потенціал для підвищення ефективності, уникаючи зайвих копій (подумайте про всі виділення та винятки, які ви можете зберегти).

Оригінальні рядки C страждали від проблеми з тим, що нульовий термінатор був частиною рядкових API, і тому ви не могли легко створити підрядки, не змінивши нижній рядок (a la strtok ). У C ++ це легко вирішити, зберігаючи довжину окремо і загортаючи вказівник та розмір в один клас.

Однією з головних перешкод та розбіжностей зі стандартною філософією бібліотеки C ++, яку я можу придумати, є те, що такі класи "референційного погляду" мають абсолютно іншу семантику власності від решти стандартної бібліотеки. В основному все інше в стандартній бібліотеці є безумовно безпечним і правильним (якщо вона компілюється, то правильно). З такими довідковими класами це вже не відповідає дійсності. Правильність вашої програми залежить від зовнішнього коду, який використовує ці класи. Так що це важче перевірити і навчити.


19
Корабель плавав за цією філософією reference_wrapper, чи не так?
Стів Джессоп

5
@KerrekSB Я боюся, що не слідкую за цим. Чи не могли б ви розширити " частину таких референтних видів перегляду, які мають абсолютно іншу семантику власності від решти стандартної бібліотеки ?" Мені не зрозуміло: чим він відрізняється від звисаючих посилань / покажчиків? Або недійсні ітератори через вставку (наприклад, std :: vector)? У нас ці питання вже є, мені цілком природно, що невласницький погляд матиме подібні проблеми, як і невласники покажчиків / посилань / ітераторів.
Алі

5
@Ali: Коли ви використовуєте будь-який інший стандартний контейнер бібліотеки, ви можете підтвердити правильність коду, просто подивившись на код, який використовує контейнер. Не так для string_view. (Я не казав, що ви ніколи не можете написати зламаний код. Тільки, що
зламаність

6
Я здивований , що вони не йдуть з std::rangeвід boost::iterator_range- IMO це краще , ніж ідея string_view
Чарльз Salvia

19
@nwp: Багато людей та мови прийшли в жахливі налаштування C ++ і вважають, що "const" та "unhared" мають бути типовими за замовчуванням, "mutable" та "shared" явні, рідкісні винятки.
Керрек СБ
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.