Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 19, средняя оценка - 4.63
boombastik
7 / 7 / 0
Регистрация: 13.02.2007
Сообщений: 1,255
#1

Размышления о string из STL - C++

18.10.2007, 11:48. Просмотров 2312. Ответов 10
Метки нет (Все метки)

Класс string из шаблона STL замечательная вещь! Но вчера он меня чуть не убил...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <string>
using namespace std
...
string a = 'abc';
string b = a;
// Я почти был уверен, что оператор присвоения перекрыт (так оно и есть) 
// и копирует данные из строки а в строку b (а вот тут я ошибался)
 
// Следите за маневром ;)
// Приведем строку b в верхний регистр
strupr((char*)b.c_str());
 
// Теперь внутри b = 'ABC'
// Но, и это чуть меня не убило, a = 'ABC'
 
// Но!
string c = a.c_str();
strlwr((char*)c.c_str());
 
// Строка c = 'abc'
// А строка a как и положено = 'ABC'
...
В последнем случае все понятно, ведь мы пытаемся писвоить costant pointer, то есть содержимое мы не имеем права изменять, поэтому приходится копировать, но в первом случае!
И почему же это не описано в документации?
Хорошо исходники всегда под рукой, хотя стоило попотеть, чтобы найти, что реализация string находится в файле xstring

К сожалению по STL в MSDN документация, не в пример MFC, слабовата

Коментарии?

У кого нибудь есть интересные ссылки по STL?

Заранее спасибо, Владимир
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.10.2007, 11:48
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Размышления о string из STL (C++):

STL и string - C++
начал тут 1 задачу на форуме решать в text1 какой-то текст, мы ищем в нем слова str и после них вставляем слова str2 вообщем я не...

Undefined symbol string (STL) - C++
подключаю следующие библиотеки #include &lt;iostream.h&gt; #include &lt;vector.h&gt; #include &lt;string.h&gt; using namespace std; void...

[STL] Работа со std::string - C++
Привет, форум. Подскажите, как можно грамотно скопировать &quot;слово&quot; из строки, с указанием начала и конца позиций. Например: string...

Использование контейнера string из библиотеки STL - C++
Дан массив слов. Сформировать новое слово из символов слов массива, стоящих после последнего символа ‘*’ в слове. Сформировать предложение...

STL sort строк string по убыванию - C++
Как по возрастанию - знаю:std::vector&lt;std::string&gt; obj; std::string str(&quot;asdfghjkl&quot;); vector.push_back(str); for (auto &amp;index : obj)...

Еще одно размышление о string из STL - C++
Если строки в STL по стандарту могут совместно использовать дин и тот же участок памяти (а это именно следуя из стандарта), тогда следующие...

10
Chuck
Сообщений: n/a
18.10.2007, 14:58 #2
Сходи на http://www.stlport.org/ . Они занимаются разширением этой библиотеки (если я не ошибаюсь). И у них есть какая-то документация. Хотя, может ты уже там был...
С уважением, Виталий
boombastik
7 / 7 / 0
Регистрация: 13.02.2007
Сообщений: 1,255
18.10.2007, 20:29  [ТС] #3
Спасибо уже скачл что-то оттуда, я еще вот такую ссылочку нашел:
http://www.sgi.com/tech/stl/download.html

А вообще надо просто, я думаю, книжечку найти по STL. У меня есть Страуструп, но он хотя и много уделяет внимания STL некоторые вопросы обходит стороной

Спасибо за помощь!
0
Alex-T
Сообщений: n/a
19.10.2007, 19:33 #4
Владимир!

(char*)b.c_str(); // А так, УВЫ,НЕЛЬЗЯ!

Смысл в том, что несколько объектов string могут ссылаться на одну область данных, ну и STL должен работать при этом 'нормально'.
А c_str() введена для выхода 'за пределы' STL, при ее использовании рекомендуется как можно скорее скопировать то что она выдает, потому что в следующий момент это может оказаться уже чем-то иным.
Ну а еще момент, раз уж вам функция возвращает const char * , то не пытайтесь сделать из него char *, что-то при этом легко может получиться 'не то'.
boombastik
7 / 7 / 0
Регистрация: 13.02.2007
Сообщений: 1,255
20.10.2007, 15:13  [ТС] #5
А как можно?

Не могли бы Вы порекомендовать как получить копию string переменной, приведенную в верний регистр?

С уважением, Владимир
0
Alex-T
Сообщений: n/a
21.10.2007, 15:27 #6
Пожалуй, вот так можно...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <string>
#include <iostream>
#include <algorithm>
#include <locale>
 
std::locale russia('Russian_Russia.1251');
/* Эта строчка работает и под MSVC 6, и под Борландами. 
 Причем только под VC можно написать для виндовой кодировки просто 'RU', 
 а 'Russian_Russia.866' под Борландами не работает, кажется */
 
inline char ToUpper (char c)
{
    return std::toupper (c, russia);
}
 
void main ()
{
     std::string a ('abc фыцю'), b;
     b = a;
     std::transform (b.begin (), b.end (),b.begin (), ToUpper);
     std::cout << a << std::endl << b << std::endl;
}
boombastik
7 / 7 / 0
Регистрация: 13.02.2007
Сообщений: 1,255
21.10.2007, 17:15  [ТС] #7
Классно!

Спасибо большое, я догадывался, что надо какой-то из алгоритмов применить, но вот какой и как...

Если не секрет ты какую книжку читал по STL? Может чего порекомендовать можешь?

С уважением, Владимир
0
Alex-T
Сообщений: n/a
21.10.2007, 18:36 #8
Книги (бумажные), которые мне попадались, не значит, что других нет...

Аммерааль Л. 'STL для программистов на С++'
Издательство ДМК, 2000. www.dmk.ru
Близко к справочнику, перечислено почти все про контенеры и алгоритмы. Правда про строки и локализацию там нет, кстати, вообще русские буквы-то нужны, а то можно просто поставить в алгоритм функцию toupper из <ctype.h>, по кр. мере в VC.

Стандартная библиотека C++ на примерах
Пабло Халперн www.williamspublishing.com
Тут именно пример использования, так что справочник она не заменяет, но справочником и MSDN вполне может служить.
boombastik
7 / 7 / 0
Регистрация: 13.02.2007
Сообщений: 1,255
21.10.2007, 18:55  [ТС] #9
Ну вообще, локализация не нужна - задача не требует.

А вот по поводу MSDN, Вы не находите, что по STL у них слабовата документация? Ни развернутых примеров ни полного описания ни ссылок See also. По-моему, этот раздел у них не очень проработан... Или это только на первый взгляд? Даже у Страуструпа гораздо больше уделено этому внимания! В MSDN они больше MFC продвигают и свои CArray, CMap, CObjMap, CPtrMap или как то так.

Кстати, раз уж пошли про STL, поддерживают ли шаблоны serialize? Можно ли, например string затолкать в поток, а потом выдернуть оттуда? Но, что более интересно, как можно организовать дерево с использованием STL, но поддерживающее serialize функции?

Впрочем, в любом случае БОЛЬШОЕ СПАСИБО!

С уважением, Владимир.
0
Alex-T
Сообщений: n/a
23.10.2007, 15:08 #10
Ну с документацией в MSDN ясно, MFC 'свое, родное', да и давно уже продвигается, а STL раз уж попало в стандарт, то приходится поддерживать...

А дерево в STL вставить еще не успели , никому не попадалось дополнение STL дреревьями?
boombastik
7 / 7 / 0
Регистрация: 13.02.2007
Сообщений: 1,255
23.10.2007, 15:25  [ТС] #11
На самом деле мне один добрый человек высылал когда-то, но у меня не было времени потестировать - погонять его, если хочешь могу поискать и поделиться?

А как насчет serialize?

С уважением, Владимир
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.10.2007, 15:25
Привет! Вот еще темы с ответами:

STL String. Вывести слово и после него количество символов - C++
Здраствуйте! У меня есть например строка string, покажите пожалуйста на примере как можно выделять слова этой строки, например вывести...

Использование библиотеки STL , контейнер string. Дан массив слов.Надо удалить все цифры из слов - C++
#include &quot;StdAfx.h&quot; #include &lt;string&gt; #include &lt;iostream&gt; #include &lt;algorithm&gt; using namespace std; int main() { string str...

Доступ к паре в map<string, vector<pair<string, string>>>Temp - C++
Подскажите пожалуйста как получить данные в векторе пар ? void showData(const map&lt;string, vector&lt;pair&lt;string, string&gt;&gt;&gt;Temp) { ...

Какое одинаковое значение можно вернуть из функций <string> f () и vector < <string> > f()? - C++
Понятное дело, что всё обсуждение будет вертеться вокруг аналога NULL. char* f_0 () { return NULL; } char** f_1 () { ...


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

Или воспользуйтесь поиском по форуму:
11
Yandex
Объявления
23.10.2007, 15:25
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru