Работаю над проектом (ATL-service) в VC++ 2008. В вышеуказаной теме выбор был между C-строками и контейнерами STL. Однако ж сегодня я открыл для себя еще и существование CAtlString.
Вопрос к знатокам — что лучше работает? На одном из форумов наткнулся на откровенную ругань в адрес ATL-строк, правда ничем не обоснованную.
Здравствуйте, agendus, Вы писали:
A>Работаю над проектом (ATL-service) в VC++ 2008. В вышеуказаной теме выбор был между C-строками и контейнерами STL. Однако ж сегодня я открыл для себя еще и существование CAtlString. A>Вопрос к знатокам — что лучше работает? На одном из форумов наткнулся на откровенную ругань в адрес ATL-строк, правда ничем не обоснованную.
CAtlString:
1. Потокобезопасный подсчёт ссылок а не непонятно что (например оптимнизация малых строк).
2. CStrBuf — буфер для записи, например, из WinAPI функций. C std::string хоть создавай scoped_array и копируй из него в таких случаях.
3. MakeUpper/MakeLower
4. Перевод A <-> W через конструктор.
5. s[i] = 'x'; — не труъ. s.SetAt(i, 'x') рулит тем, что ссылку на результат [] не сохранишь.
6. Empty() — это глагол!
7. Длина — это GetLength(), а что такое size() — не очевидно.
8. Можно _tprintf(_T("%s"), s); — с CAtlString прокатит.
Здравствуйте, agendus, Вы писали:
A>Вопрос к знатокам — что лучше работает? На одном из форумов наткнулся на откровенную ругань в адрес ATL-строк, правда ничем не обоснованную.
Работают они обе нормально, вообще если используете STL то и используйте их строки, если нет, то и CAtlString вполне подойдет.
Здравствуйте, pvirk, Вы писали:
AG>>7. Длина — это GetLength(), а что такое size() — не очевидно. P>Можно не size(), можно length().
Можно. Но wstring::size() от этого не станет размером в байтах, он останется равен length(). Тех, кто не помнит, что wstring — это контейнер STL, этот факт может удивить
Здравствуйте, BigBan, Вы писали:
BB>Работают они обе нормально, вообще если используете STL то и используйте их строки, если нет, то и CAtlString вполне подойдет.
А я предпочитаю использовать контейнеры STL и строки ATL. И даже засовывать ATLные строки в STLные контейнеры.
(А вот ATLные контейнеры — это отстой).
ATLные строки реально удобнее в большинстве случаев.
Даже если мне захочется итерировать по строке с помощью STLных алгоритмов — никаких проблем:
((LPCTSTR)s, (LPCTSTR)s+s.GetLength()).
Здравствуйте, Alexander G, Вы писали:
AG>>>7. Длина — это GetLength(), а что такое size() — не очевидно. P>>Можно не size(), можно length().
AG>Можно. Но wstring::size() от этого не станет размером в байтах, он останется равен length(). Тех, кто не помнит, что wstring — это контейнер STL, этот факт может удивить
Не понимаю, откуда вообще берутся мысли о байтах?! У всех контейнеров size — это размер в элементах.
Другое дело, что size строк (что STL, что ATL) исключает из внимания концевой ноль, ибо ваистену он находится за концом строки символов.
А вот length — это как раз неочевидно.
+ То ли строго равно size (непонятно только, зачем сделали два разных метода?),
— то ли до первого встреченного нуля (т.е. в соответствии с функцией strlen/wcslen, а то и mbslen...)