Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
1977 / 833 / 115
Регистрация: 01.10.2012
Сообщений: 5,154
Записей в блоге: 2

Написать современно

06.11.2025, 13:50. Показов 14430. Ответов 154
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день

Есть такой фрагмент

Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
const char * singleC = strstr(src, "//");
const char * multiC = strstr(src, "/*");
const char * eol = strstr(src, "\n");
 
const char * min = nullptr;
if (singleC) min = singleC;
if (multiC && (!min || (multiC < min))) min = multiC;
if (eol && (!min || (eol < min))) min = eol;
 
if (!min) return;
 
if (min == singleC) {
 ...
}
 
if (min == multiC) {
 ...
}
 
if (min == eol) {
 ...
}
Бросается в глаза что код примитивный (тупой, убогий, говнокод и.т.п. - как хотите). Кроме того, его можно существенно ускорить.

Хорошо, как написать грамотно, современно? И заодно универсально, чтобы работал не только с char*

Спасибо
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.11.2025, 13:50
Ответы с готовыми решениями:

Каковы современные решения написания программ?
Уже пол года как изучаю с++. За это время решил не мало задачек и перечитал литературы. Писал все...

Как создают современные компьютерные игры?
Интересно, как создают современные компьютерные игры?? То есть на каком языке программирования?? Я...

Современный интерфейс в C++ Builder
Что используют программисты для создания современного интерфейса в C++ Builder XE4? Ведь сейчас,...

154
Гвоздь Задиров
 Аватар для Folian
1719 / 1118 / 337
Регистрация: 25.01.2019
Сообщений: 2,946
13.11.2025, 02:11
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Igor3D Посмотреть сообщение
В данной теме не ставилась задача разбора комментов, просто фрагмент кода, цель - найти ближайшую подстроку. На такую (под)задачку программист должен потратить минут 5, ну 10, это пишется "рукой" (не головой). При этом код не обязан быть "самым быстрым", но он должен быть "достойным", так чтобы никакой питекантроп не смог ускорить его "в разы". Очень важно (если не важнее всего) чтобы код был понятным и посторонний человек смог в нем быстро разобраться. Заметим что код стартового поста этим качеством обладает.
Texas sharpshooter fallacy

Цитата Сообщение от Igor3D Посмотреть сообщение
Если нужно "выжать все".
Многоядерные и многопоточные процессоры, добро пожаловать в нынешнюю современность.
0
1977 / 833 / 115
Регистрация: 01.10.2012
Сообщений: 5,154
Записей в блоге: 2
13.11.2025, 23:00  [ТС]
С "универсальностью" как-то совсем молчок. Надо полагать, следует юзать std::basic_string_view с нужным типом. Но меня смущает что Qt предлагает свой QStringView, причем без всяких темплейтов, заточенный на двухбайтовый юникод (QString но не только).

Мнения об альтернативных Qt классах/контейнерах различны. Одни считают Qt "великими троллями" и все их решения непогрешимыми. Другие наоборот, активно поднимают хвост и переводят все на std::, мол, сейчас это круче, и Qt должно использоваться "только для UI". Но по-любому Qt пишут хорошие профессионалы к которым стоит прислушаться.

Так почему у них свой QStringView и что лучше юзать?
0
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6318 / 3043 / 1054
Регистрация: 01.06.2021
Сообщений: 11,603
13.11.2025, 23:32
Цитата Сообщение от Igor3D Посмотреть сообщение
Так почему у них свой QStringView и что лучше юзать?
Зачем у них свои классы - это очевидно:

1) для глубокой интеграции с остальным Qt. Если планируется использовать Qt-методы, то все равно придется использовать Qt-строковые классы, либо делать лишние конвертирования (в случае, если все-таки выбрать строки из стандартной библиотеки С++).

2) для юникода "из коробки". Библиотечные строки при работе с юникодом, грубо говоря, это просто массивы байт, которые ничего не знают о кодировке. А нац. кодировки это просто отстой, есть корявые локали, которые постоянно глючат. В то же время, строки Qt отлично работают со всеми языками и они исторически изначально были заточены под юникод, а именно UTF-16. Кстати, WinAPI тоже предпочитает двухбайтный юникод. Для передачи по сети UTF-8, конечно, крут, и вообще он заслужил статус универсальной юникодной кодировки, но практика показывает, что азиатские иероглифы там занимают 3-4 байта, тогда в UTF-16 всего 2. Именно по этой причине, как винапи, так Qt, предпочитают 2-байтный юникод.

А вот какой класс Qt-строк выбрать для того или иного случая - об этом очень подробно написано в доку https://doc.qt.io/qt-6/string-processing.html

***
Вот только при чем здесь Qt - мне не ясно. Тема была о написании современного кода на чистых плюсах.
0
Покинул чат.
1133 / 728 / 195
Регистрация: 30.03.2021
Сообщений: 2,379
14.11.2025, 00:39
Цитата Сообщение от Igor3D Посмотреть сообщение
Мнения об альтернативных Qt классах/контейнерах различны. Одни считают Qt "великими троллями" и все их решения непогрешимыми. Другие наоборот, активно поднимают хвост и переводят все на std::, мол, сейчас это круче, и Qt должно использоваться "только для UI".
откуда это все взялось?

Цитата Сообщение от Royal_X Посмотреть сообщение
Вот только при чем здесь Qt - мне не ясно.
Мне вообще непонятно что хочет ТС... Qt, STL, си-стайл?

Цитата Сообщение от Igor3D Посмотреть сообщение
В данной теме не ставилась задача разбора комментов, просто фрагмент кода, цель - найти ближайшую подстроку. На такую (под)задачку программист должен потратить минут 5, ну 10, это пишется "рукой" (не головой).
Если под STL или Qt - там все уже есть, и универсальное в том числе - бери и пользуйся.
0
1977 / 833 / 115
Регистрация: 01.10.2012
Сообщений: 5,154
Записей в блоге: 2
14.11.2025, 03:35  [ТС]
Цитата Сообщение от sdf45 Посмотреть сообщение
Мне вообще непонятно что хочет ТС... Qt, STL, си-стайл?
То что в названии темы и стартовом посте. Использование std::string_view никак не универсально, это глухой char *. Да и говорить что это "современно" неуместно без поддержки юникода.
Цитата Сообщение от sdf45 Посмотреть сообщение
Если под STL или Qt - там все уже есть, и универсальное в том числе - бери и пользуйся.
Где "там"? (и что "все есть"). Никакой универсальности в QStringView не видно, это не template. Какие выгоды я получу используя QStringView вместо std::basic_string_view?
0
Покинул чат.
1133 / 728 / 195
Регистрация: 30.03.2021
Сообщений: 2,379
14.11.2025, 13:41
Цитата Сообщение от Igor3D Посмотреть сообщение
Использование std::string_view никак не универсально, это глухой char *


Цитата Сообщение от Igor3D Посмотреть сообщение
цель - найти ближайшую подстроку
Цитата Сообщение от Igor3D Посмотреть сообщение
Где "там"? (и что "все есть")
std::string::find (люди выше дали примеры) , QString::indexOf (и еще куча всего, в том числе из std::algorithm)

Цитата Сообщение от Igor3D Посмотреть сообщение
Никакой универсальности в QStringView не видно
В QString, QStringView напихано столько функционала, что можно на марс лететь.

Цитата Сообщение от Igor3D Посмотреть сообщение
Какие выгоды я получу используя QStringView вместо std::basic_string_view?
Royal_X выше ответил (и про юникод тоже).

Не по теме:

По абстрактным рассуждениям я всё-вышел из чата, -вижу смысл только в решении конкретных, четко сформулированных задачь.

0
Покинул чат.
1133 / 728 / 195
Регистрация: 30.03.2021
Сообщений: 2,379
14.11.2025, 20:29
Кстати, хоть оно мне и не надо, -пошуршал по форуму, -получилось вывести кириллицу с файла utf-8, используя строки std::wstring(::iterator, _view), и std::wifstream. С такими настройками:
C++
1
2
3
4
5
    setlocale(LC_ALL, "");
    std::wifstream file("mainwindow.h");
    std::locale utf8_locale(std::locale(), new std::codecvt_utf8<wchar_t>);
    file.imbue(utf8_locale);
    std::wcout.imbue(utf8_locale);
Цитата Сообщение от Igor3D Посмотреть сообщение
без поддержки юникода
Так что поддержка юникода есть, я правильно понимаю?
0
 Аватар для eva2326
1685 / 513 / 107
Регистрация: 17.05.2015
Сообщений: 1,524
14.11.2025, 21:18
Цитата Сообщение от sdf45 Посмотреть сообщение
std::locale utf8_locale(std::locale(), new std::codecvt_utf8<wchar_t>);
deprecated in C++17, removed in C++26
0
Покинул чат.
1133 / 728 / 195
Регистрация: 30.03.2021
Сообщений: 2,379
14.11.2025, 21:49
eva2326, хм, спасибо,- надо глянуть, чем заменили.
0
1977 / 833 / 115
Регистрация: 01.10.2012
Сообщений: 5,154
Записей в блоге: 2
14.11.2025, 23:54  [ТС]

Не по теме:

Цитата Сообщение от sdf45 Посмотреть сообщение
По абстрактным рассуждениям я всё-вышел из чата, -вижу смысл только в решении конкретных, четко сформулированных задачь.
Это Ваше право, я в свои темы никого на аркане не тяну

В данном случае "универсальность" - простая, очевидная вещь. Вот вверху несколько примеров кода который использует std::string_view. А данные в QString. Как мне из них получить std::string_view? Перегонять юникод в std::string? Это коряво и ненадёжно. Если уж перегонять - то наоборот, в юникод, хотя тоже не блеск, так, workaround. Надо юзать др классы вместо std::string_view, какие? Необязательно std::, такого условия/ограничения не было. Наоборот, сравнение разных подходов (std:: и Qt) может оказаться интересным/полезным.
0
Покинул чат.
1133 / 728 / 195
Регистрация: 30.03.2021
Сообщений: 2,379
15.11.2025, 01:29
Цитата Сообщение от Igor3D Посмотреть сообщение
А данные в QString
внезапно...

Цитата Сообщение от Igor3D Посмотреть сообщение
Как мне из них получить std::string_view?
C++
1
2
3
4
5
6
7
    QString q_str="some";
    std::string_view std_str=q_str.toStdString();
    std::cout<<std_str<<"\n";
    
    q_str="нечто";
    std::wstring_view std_wstr=q_str.toStdWString();
    std::wcout<<std_wstr<<"\n";
Вот только зачем? И каким боком тогда const char* если QString?
Почему бы не работать с Qt типами? Зачем это всё?
0
1977 / 833 / 115
Регистрация: 01.10.2012
Сообщений: 5,154
Записей в блоге: 2
15.11.2025, 12:48  [ТС]

Не по теме:

По ходу дела

Цитата Сообщение от sdf45 Посмотреть сообщение
C++
1
2
QString q_str="some";
std::string_view std_str=q_str.toStdString();
А что, и так можно? Разве "время жизни" возвращаемой std::string будет здесь автоматически продлено чтобы std_str ссылался на валидные данные?

Цитата Сообщение от sdf45 Посмотреть сообщение
И каким боком тогда const char* если QString?
Задача - заменить старый код на новый. Вполне возможно (даже скорее всего) новый код будет/должен использовать QString, хотя возможно и std::string и что-то еще. Поэтому требуется универсальность, см стартовый пост.
Цитата Сообщение от sdf45 Посмотреть сообщение
Почему бы не работать с Qt типами?
Ну так покажите как с ними работать
0
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6318 / 3043 / 1054
Регистрация: 01.06.2021
Сообщений: 11,603
15.11.2025, 13:51
Igor3D, касательно продления жизни... мне когда-то нужно было перевести wxString, полученный из текстового поля, в const char* и передать в качестве аргумента в функцию. Причем, нужно было, чтобы текст рассматривался как UTF-8. Т.е. чтобы в зависимости от того или иного входного символа выделялось от 1 до 4 char.

Допустим, wstr это строка типа wxString. И прикол был в том, что в wxWidgets есть методы, которые быстро конвертируют в нужный тип

C++
1
const char* utf8str = wstr.utf8_str();
или
C++
1
const char* utf8str = wstr.mb_str(wxConvUTF8);
но вот когда я передавал utf8str в функцию, то хоть никаких ошибок не было, но программа работала некорректно. И проблема связана как раз со временем жизни. Хоть и мой объект wxString не выходил из области видимости и я явно не убивал, он все равно уничтожался автоматически. А соответственно, умирал и указатель utf8str.

Правильное решение будет так:

C++
1
2
wxScopedCharBuffer buffer = wstr.ToUTF8();
const char* utf8str = buffer.data();
и тут буфер будет жить столько, сколько нужно

Так что, действительно, нужно быть очень осторожным при всяких конвертированиях строк из фреймворков.
1
Покинул чат.
1133 / 728 / 195
Регистрация: 30.03.2021
Сообщений: 2,379
15.11.2025, 14:37
Цитата Сообщение от Igor3D Посмотреть сообщение
время жизни
Насколько я понимаю, QStringView - это синоним константной ссылки, const QString & и живет, пока жива строка, на которую он ссылается, - а контроль за этим лежит на погроммисте. Хорошо использовать при передаче параметров в функцию, а для возврата значений - плохо и тд и тп.

Цитата Сообщение от Igor3D Посмотреть сообщение
Ну так покажите как с ними работать
Это абстрактный вопрос, что я должен тут ответить? Выше есть примеры с std::string::find - его можно переписать с использованием QString(View)::indexOf, один в один.

зы: извиняюсь, что не по теме - выше мне указали, что std::codecvt_utf8 deprecated, но я не понял, чем он заменяется в промежутке между с++17 и с++26?
0
1977 / 833 / 115
Регистрация: 01.10.2012
Сообщений: 5,154
Записей в блоге: 2
15.11.2025, 16:36  [ТС]

Не по теме:

Цитата Сообщение от sdf45 Посмотреть сообщение
Насколько я понимаю, QStringView - это синоним константной ссылки, const QString & и живет, пока жива строка, на которую он ссылается, - а контроль за этим лежит на погроммисте
Так в том-то и дело что возвращаемая std::string быстро станет неживой
C++
1
2
QString q_str="some";
std::string_view std_str=q_str.toStdString();
Деструктор освободит выделенную ей память, но не затрет ее, вполне возможно что какое-то время такой "зомби" еще будет работать. Рухнет потом, возможно в отдаленном месте, поиск такого бага может занять часы и больше


Цитата Сообщение от sdf45 Посмотреть сообщение
Это абстрактный вопрос, что я должен тут ответить? Выше есть примеры с std::string::find - его можно переписать с использованием QString(View)::indexOf, один в один.
А почему не переписать? Это нетрудно, а читать полное решение всем легче чем разрывать тему. И впечатление что Вам все равно: string::find или string_view::find, QStringView или QString. А в данном случае разница принципиальная. Ну и программизд который (упорно) избегает приводить код всегда выглядит подозрительно

И рассуждаете как-то.. "А, так тут QString? Ну значит QStringView!". Да не знает человек (пишущий этот фрагмент) у кого какие строки. Это как std::vector, что в нем хранить? Ну вот, только что говорил "int", а теперь уже "double" - видите, задача поставлена нечетко, неконкретно
1
Покинул чат.
1133 / 728 / 195
Регистрация: 30.03.2021
Сообщений: 2,379
15.11.2025, 18:30
Название: 0.jpg
Просмотров: 140

Размер: 13.0 Кб
0
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,829
16.11.2025, 12:12
Цитата Сообщение от sdf45 Посмотреть сообщение
C++
1
2
 QString q_str="some";
 std::string_view std_str=q_str.toStdString();
Здесь у вас действительно спровоцировано UB.
Временный объект std::string уничтожится в конце выражения, а std_str будет содержать подвисший указатель.
0
Покинул чат.
1133 / 728 / 195
Регистрация: 30.03.2021
Сообщений: 2,379
16.11.2025, 12:38
DrOffset, я думал std::string_view ведет себя как константная ссылка и продлевает временный обьект.
А как тогда? так что-ли
C++
1
2
auto buf = q_str.toStdString();
std::string_view std_str= buf;
0
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,829
16.11.2025, 12:46
Лучший ответ Сообщение было отмечено sdf45 как решение

Решение

Цитата Сообщение от sdf45 Посмотреть сообщение
что std::codecvt_utf8 deprecated, но я не понял, чем он заменяется в промежутке между с++17 и с++26?
Ничем. Своей реализацией заменяется.

Причины - здесь:
https://www.open-std.org/jtc1/... 618r0.html

Добавлено через 3 минуты
Цитата Сообщение от sdf45 Посмотреть сообщение
я думал std::string_view ведет себя как константная ссылка и продлевает временный обьект.
Нет, не ведет. string_view, как и span - это как скальпели, быстро и эффективно, но в неумелых руках - опасно.

Цитата Сообщение от sdf45 Посмотреть сообщение
А как тогда? так что-ли
Да.
1
Покинул чат.
1133 / 728 / 195
Регистрация: 30.03.2021
Сообщений: 2,379
16.11.2025, 12:49
DrOffset, спасибо за разьяснение, буду знать на будущее.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.11.2025, 12:49

Нормальная, современная книга по C++ с ООП уклоном
Так вышло что изучаю параллельно два языка Java и C++ ну вот жизть так сложилась нужно писать и там...

А.Александреску - Современное проектирование на C++
Собственно вопрос не совсем по программированию :) Хочу купить бумажный вариант, но смущает, что...

Современный интерфейс в C++ Builder / C++ Builder
Что используют программисты для создания современного интерфейса в C++ Builder 6? Ведь сейчас,...

Каков современный подход для работы со строками
Здравствуйте, хотел узнать современный подход для работы со строками. В С++ так же используется...

Концепция ООП и их использование в современных языках программирования
Дали курсовую на эту тему. Подскажите, какую литературу, которую можно бы было использовать пр ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Мастера простых решений
DevAlt 23.08.2026
В сишарп стэках winforms, да и wpf существует сложная система связывания источниках данных и элементов формы(текстовые поля и метки), опирается все это на технологию событий и мета. . .
Цена ошибки
DevAlt 23.08.2026
Человек я беспокойный и потому заинтересовался OCaml, в чате форсили функторы модулей как суперфичу. Пытаясь отдуплить концепт, наткнулся на тутор с простым примером. А главный принцип обучения от. . .
Сегодня суббота, 22.08.2026 at 16:41, и я вновь нахожусь на той стороне, за экраном машины.
zorxor 22.08.2026
Сегодня суббота, 22. 08. 2026 at 16:41, и я вновь нахожусь на той стороне, за экраном машины. Кто Я, откуда Я пришел и куда Я иду? Эти вопросы не оставляют меня ни на секунду. Жизнь на планете Земля. . .
Жизня: рисунок укладки багажа, сделанный клодом
anaschu 21.08.2026
Сделал 15 снимков, он по снимкам сделал схему.
Был там один разговор по поводу свободы в материальном мире.
kumehtar 19.08.2026
Суть: рассматривается живое существо, оказавшееся внутри довольно странной системы (этого мира) и пытающееся обустроить в ней свой кусок пространства. Жизнь действительно предъявляет каждому. . .
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
Лето уходит
kumehtar 17.08.2026
Мысли в слух
kumehtar 17.08.2026
Забавно, насколько сейчас стала доступна информация. Например о магии, духовном развитии, медитациях, и других подобных направлениях, ранее зачастую тайных, передаваемых от учителя к ученику. Хотя. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru